Skip to content

Commit c5b8624

Browse files
zwy1234zwy1234yanglbme
authored
feat: add solutions to lcp problems (doocs#822)
Co-authored-by: zwy1234 <zwy19980919@163.com> Co-authored-by: Yang Libin <contact@yanglibin.info>
1 parent 80d117e commit c5b8624

File tree

11 files changed

+289
-6
lines changed

11 files changed

+289
-6
lines changed

lcp/LCP 07. 传递信息/README.md

+22-2
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,42 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
**方法一:动态规划**
51+
5052
<!-- tabs:start -->
5153

5254
### **Python3**
5355

5456
<!-- 这里可写当前语言的特殊实现逻辑 -->
5557

5658
```python
57-
59+
class Solution:
60+
def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
61+
dp = [[0] * n for _ in range(k + 1)]
62+
dp[0][0] = 1
63+
for i in range(1, k + 1):
64+
for a, b in relation:
65+
dp[i][b] += dp[i - 1][a]
66+
return dp[-1][-1]
5867
```
5968

6069
### **Java**
6170

6271
<!-- 这里可写当前语言的特殊实现逻辑 -->
6372

6473
```java
65-
74+
class Solution {
75+
public int numWays(int n, int[][] relation, int k) {
76+
int[][] dp = new int[k + 1][n];
77+
dp[0][0] = 1;
78+
for (int i = 1; i <= k; i++) {
79+
for (int[] r : relation) {
80+
dp[i][r[1]] += dp[i - 1][r[0]];
81+
}
82+
}
83+
return dp[k][n - 1];
84+
}
85+
}
6686
```
6787

6888
### **...**
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public int numWays(int n, int[][] relation, int k) {
3+
int[][] dp = new int[k + 1][n];
4+
dp[0][0] = 1;
5+
for (int i = 1; i <= k; i++) {
6+
for (int[] r : relation) {
7+
dp[i][r[1]] += dp[i - 1][r[0]];
8+
}
9+
}
10+
return dp[k][n - 1];
11+
}
12+
}

lcp/LCP 07. 传递信息/Solution.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
3+
dp = [[0] * n for _ in range(k + 1)]
4+
dp[0][0] = 1
5+
for i in range(1, k + 1):
6+
for a, b in relation:
7+
dp[i][b] += dp[i - 1][a]
8+
return dp[-1][-1]
9+

lcp/LCP 08. 剧情触发时间/README.md

+56-2
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,76 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:前缀和 + 二分查找**
65+
6466
<!-- tabs:start -->
6567

6668
### **Python3**
6769

6870
<!-- 这里可写当前语言的特殊实现逻辑 -->
6971

7072
```python
71-
73+
class Solution:
74+
def getTriggerTime(self, increase: List[List[int]], requirements: List[List[int]]) -> List[int]:
75+
increase.insert(0, [0, 0, 0])
76+
m, n = len(increase), len(requirements)
77+
for i in range(1, m):
78+
for j in range(3):
79+
increase[i][j] += increase[i - 1][j]
80+
ans = [-1] * n
81+
for i, req in enumerate(requirements):
82+
left, right = 0, m
83+
while left < right:
84+
mid = (left + right) >> 1
85+
if all(a >= b for a, b in zip(increase[mid], req)):
86+
ans[i] = mid
87+
right = mid
88+
else:
89+
left = mid + 1
90+
return ans
7291
```
7392

7493
### **Java**
7594

7695
<!-- 这里可写当前语言的特殊实现逻辑 -->
7796

7897
```java
79-
98+
class Solution {
99+
public int[] getTriggerTime(int[][] increase, int[][] requirements) {
100+
int m = increase.length, n = requirements.length;
101+
int[][] s = new int[m + 1][3];
102+
for (int j = 0; j < 3; ++j) {
103+
for (int i = 0; i < m; ++i) {
104+
s[i + 1][j] = s[i][j] + increase[i][j];
105+
}
106+
}
107+
108+
int[] ans = new int[n];
109+
Arrays.fill(ans, -1);
110+
for (int i = 0; i < n; ++i) {
111+
int left = 0, right = m + 1;
112+
while (left < right) {
113+
int mid = (left + right) >> 1;
114+
if (check(s[mid], requirements[i])) {
115+
ans[i] = mid;
116+
right = mid;
117+
} else {
118+
left = mid + 1;
119+
}
120+
}
121+
}
122+
return ans;
123+
}
124+
125+
private boolean check(int[] a, int[] b) {
126+
for (int i = 0; i < 3; ++i) {
127+
if (a[i] < b[i]) {
128+
return false;
129+
}
130+
}
131+
return true;
132+
}
133+
}
80134
```
81135

82136
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
public int[] getTriggerTime(int[][] increase, int[][] requirements) {
3+
int m = increase.length, n = requirements.length;
4+
int[][] s = new int[m + 1][3];
5+
for (int j = 0; j < 3; ++j) {
6+
for (int i = 0; i < m; ++i) {
7+
s[i + 1][j] = s[i][j] + increase[i][j];
8+
}
9+
}
10+
11+
int[] ans = new int[n];
12+
Arrays.fill(ans, -1);
13+
for (int i = 0; i < n; ++i) {
14+
int left = 0, right = m + 1;
15+
while (left < right) {
16+
int mid = (left + right) >> 1;
17+
if (check(s[mid], requirements[i])) {
18+
ans[i] = mid;
19+
right = mid;
20+
} else {
21+
left = mid + 1;
22+
}
23+
}
24+
}
25+
return ans;
26+
}
27+
28+
private boolean check(int[] a, int[] b) {
29+
for (int i = 0; i < 3; ++i) {
30+
if (a[i] < b[i]) {
31+
return false;
32+
}
33+
}
34+
return true;
35+
}
36+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def getTriggerTime(self, increase: List[List[int]], requirements: List[List[int]]) -> List[int]:
3+
increase.insert(0, [0, 0, 0])
4+
m, n = len(increase), len(requirements)
5+
for i in range(1, m):
6+
for j in range(3):
7+
increase[i][j] += increase[i - 1][j]
8+
ans = [-1] * n
9+
for i, req in enumerate(requirements):
10+
left, right = 0, m
11+
while left < right:
12+
mid = (left + right) >> 1
13+
if all(a >= b for a, b in zip(increase[mid], req)):
14+
ans[i] = mid
15+
right = mid
16+
else:
17+
left = mid + 1
18+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
public int expectNumber(int[] scores) {
3+
Set<Integer> s = new HashSet<>();
4+
for (int v : scores) {
5+
s.add(v);
6+
}
7+
return s.size();
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class Solution:
2+
def expectNumber(self, scores: List[int]) -> int:
3+
return len(set(scores))

lcp/LCP 34. 二叉树染色/README.md

+62-2
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,75 @@
4040
<!-- 这里可写当前语言的特殊实现逻辑 -->
4141

4242
```python
43-
43+
# Definition for a binary tree node.
44+
# class TreeNode:
45+
# def __init__(self, x):
46+
# self.val = x
47+
# self.left = None
48+
# self.right = None
49+
50+
class Solution:
51+
def maxValue(self, root: TreeNode, k: int) -> int:
52+
def dfs(root):
53+
ans = [0] * (k + 1)
54+
if root is None:
55+
return ans
56+
l, r = dfs(root.left), dfs(root.right)
57+
for i in range(k):
58+
for j in range(k - i):
59+
ans[i + j + 1] = max(ans[i + j + 1], l[i] + r[j] + root.val)
60+
for i in range(k + 1):
61+
for j in range(k + 1):
62+
ans[0] = max(ans[0], l[i] + r[j])
63+
return ans
64+
65+
return max(dfs(root))
4466
```
4567

4668
### **Java**
4769

4870
<!-- 这里可写当前语言的特殊实现逻辑 -->
4971

5072
```java
51-
73+
/**
74+
* Definition for a binary tree node.
75+
* public class TreeNode {
76+
* int val;
77+
* TreeNode left;
78+
* TreeNode right;
79+
* TreeNode(int x) { val = x; }
80+
* }
81+
*/
82+
class Solution {
83+
public int maxValue(TreeNode root, int k) {
84+
int[] t = dfs(root, k);
85+
int ans = 0;
86+
for (int v : t) {
87+
ans = Math.max(ans, v);
88+
}
89+
return ans;
90+
}
91+
92+
private int[] dfs(TreeNode root, int k) {
93+
int[] ans = new int[k + 1];
94+
if (root == null) {
95+
return ans;
96+
}
97+
int[] l = dfs(root.left, k);
98+
int[] r = dfs(root.right, k);
99+
for (int i = 0; i < k; ++i) {
100+
for (int j = 0; j < k - i; ++j) {
101+
ans[i + j + 1] = Math.max(ans[i + j + 1], l[i] + r[j] + root.val);
102+
}
103+
}
104+
for (int i = 0; i <= k; ++i) {
105+
for (int j = 0; j <= k; ++j) {
106+
ans[0] = Math.max(ans[0], l[i] + r[j]);
107+
}
108+
}
109+
return ans;
110+
}
111+
}
52112
```
53113

54114
### **...**
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
public int maxValue(TreeNode root, int k) {
12+
int[] t = dfs(root, k);
13+
int ans = 0;
14+
for (int v : t) {
15+
ans = Math.max(ans, v);
16+
}
17+
return ans;
18+
}
19+
20+
private int[] dfs(TreeNode root, int k) {
21+
int[] ans = new int[k + 1];
22+
if (root == null) {
23+
return ans;
24+
}
25+
int[] l = dfs(root.left, k);
26+
int[] r = dfs(root.right, k);
27+
for (int i = 0; i < k; ++i) {
28+
for (int j = 0; j < k - i; ++j) {
29+
ans[i + j + 1] = Math.max(ans[i + j + 1], l[i] + r[j] + root.val);
30+
}
31+
}
32+
for (int i = 0; i <= k; ++i) {
33+
for (int j = 0; j <= k; ++j) {
34+
ans[0] = Math.max(ans[0], l[i] + r[j]);
35+
}
36+
}
37+
return ans;
38+
}
39+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution:
9+
def maxValue(self, root: TreeNode, k: int) -> int:
10+
def dfs(root):
11+
ans = [0] * (k + 1)
12+
if root is None:
13+
return ans
14+
l, r = dfs(root.left), dfs(root.right)
15+
for i in range(k):
16+
for j in range(k - i):
17+
ans[i + j + 1] = max(ans[i + j + 1], l[i] + r[j] + root.val)
18+
for i in range(k + 1):
19+
for j in range(k + 1):
20+
ans[0] = max(ans[0], l[i] + r[j])
21+
return ans
22+
23+
return max(dfs(root))

0 commit comments

Comments
 (0)