Skip to content

Commit 695de0f

Browse files
committed
feat: update solutions to lc problem: No.1646
No.1646.Get Maximum in Generated Array
1 parent 3970b6b commit 695de0f

File tree

12 files changed

+95
-72
lines changed

12 files changed

+95
-72
lines changed

lcci/17.05.Find Longest Subarray/Solution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ def findLongestSubarray(self, array: List[str]) -> List[str]:
1010
k = j + 1
1111
else:
1212
vis[s] = i
13-
return array[k: k + mx]
13+
return array[k : k + mx]

solution/1600-1699/1605.Find Valid Matrix Given Row and Column Sums/README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,15 @@
7878

7979
**方法一:贪心 + 构造**
8080

81-
从左上角开始,每次选择行和列中较小的值,作为当前位置的值。即 `ans[i][j] = min(rowSum[i], colSum[j])`
81+
我们可以先初始化一个 $m$ 行 $n$ 列的答案矩阵 $ans$
8282

83-
时间复杂度 $O(m \times n)$,其中 $m$ 和 $n$ 分别是 `rowSum``colSum` 的长度。
83+
接下来,遍历矩阵的每一个位置 $(i, j)$,将该位置的元素设为 $x = min(rowSum[i], colSum[j])$,并将 $rowSum[i]$ 和 $colSum[j]$ 分别减去 $x$。遍历完所有的位置后,我们就可以得到一个满足题目要求的矩阵 $ans$。
84+
85+
以上策略的正确性说明如下:
86+
87+
根据题目的要求,我们知道 $rowSum$ 和 $colSum$ 的和是相等的,那么 $rowSum[0]$ 一定小于等于 $\sum_{j = 0}^{n - 1} colSum[j]$。所以,在经过 $n$ 次操作后,一定能够使得 $rowSum[0]$ 为 $0$,并且保证对任意 $j \in [0, n - 1]$,都有 $colSum[j] \geq 0$。
88+
89+
因此,我们把原问题缩小为一个 $m-1$ 行和 $n$ 列的子问题,继续进行上述的操作,直到 $rowSum$ 和 $colSum$ 中的所有元素都为 $0$,就可以得到一个满足题目要求的矩阵 $ans$。
8490

8591
<!-- tabs:start -->
8692

solution/1600-1699/1617.Count Subtrees With Max Distance Between Cities/Solution.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
class Solution:
2-
def countSubgraphsForEachDiameter(self, n: int, edges: List[List[int]]) -> List[int]:
2+
def countSubgraphsForEachDiameter(
3+
self, n: int, edges: List[List[int]]
4+
) -> List[int]:
35
def dfs(u: int, d: int = 0):
46
nonlocal mx, nxt, msk
57
if mx < d:

solution/1600-1699/1620.Coordinate With Maximum Network Quality/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575

7676
**方法一:暴力枚举**
7777

78-
由于坐标点的范围是 `[0, 50]`,因此我们可以直接暴力枚举所有的坐标点 $(i, j)$,计算每个坐标点的信号强度,然后找出信号强度最大的坐标点。
78+
由于坐标点的范围是 $[0,.. 50]$,因此我们可以直接暴力枚举所有的坐标点 $(i, j)$,计算每个坐标点的信号强度,然后找出信号强度最大的坐标点。
7979

8080
时间复杂度 $O(n \times C^2)$,其中 $n$ 是信号塔的数量,而 $C$ 是坐标点的范围大小。
8181

solution/1600-1699/1646.Get Maximum in Generated Array/README.md

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,17 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67-
直接模拟生成 nums 数组,然后求 nums 中元素的最大值即可。
67+
**方法一:模拟**
68+
69+
我们先判断 $n$ 的值,如果 $n < 2$,则直接返回 $n$。
70+
71+
否则,我们创建一个长度为 $n + 1$ 的数组 $nums$,并初始化 $nums[0] = 0$ 以及 $nums[1] = 1$。
72+
73+
然后从下标 $2$ 开始遍历,如果当前下标 $i$ 为偶数,则 $nums[i] = nums[i / 2]$,否则 $nums[i] = nums[i / 2] + nums[i / 2 + 1]$。
74+
75+
最后返回数组 $nums$ 中的最大值即可。
76+
77+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为给定的整数。
6878

6979
<!-- tabs:start -->
7080

@@ -75,8 +85,8 @@
7585
```python
7686
class Solution:
7787
def getMaximumGenerated(self, n: int) -> int:
78-
if n == 0:
79-
return 0
88+
if n < 2:
89+
return n
8090
nums = [0] * (n + 1)
8191
nums[1] = 1
8292
for i in range(2, n + 1):
@@ -91,12 +101,12 @@ class Solution:
91101
```java
92102
class Solution {
93103
public int getMaximumGenerated(int n) {
94-
if (n == 0) {
95-
return 0;
104+
if (n < 2) {
105+
return n;
96106
}
97107
int[] nums = new int[n + 1];
98108
nums[1] = 1;
99-
for (int i = 2; i < n + 1; ++i) {
109+
for (int i = 2; i <= n; ++i) {
100110
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
101111
}
102112
return Arrays.stream(nums).max().getAsInt();
@@ -110,37 +120,38 @@ class Solution {
110120
class Solution {
111121
public:
112122
int getMaximumGenerated(int n) {
113-
if (n == 0) return 0;
114-
vector<int> ans(n + 1, 0);
115-
ans[1] = 1;
116-
for (int i = 2; i < n + 1; ++i)
117-
ans[i] = i % 2 == 0 ? ans[i >> 1] : ans[i >> 1] + ans[(i >> 1) + 1];
118-
return *max_element(ans.begin(), ans.end());
123+
if (n < 2) {
124+
return n;
125+
}
126+
int nums[n + 1];
127+
nums[0] = 0;
128+
nums[1] = 1;
129+
for (int i = 2; i <= n; ++i) {
130+
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
131+
}
132+
return *max_element(nums, nums + n + 1);
119133
}
120134
};
121135
```
122136
123137
### **Go**
124138
125139
```go
126-
func getMaximumGenerated(n int) int {
127-
if n == 0 {
128-
return 0
140+
func getMaximumGenerated(n int) (ans int) {
141+
if n < 2 {
142+
return n
129143
}
130144
nums := make([]int, n+1)
131145
nums[1] = 1
132146
for i := 2; i <= n; i++ {
133147
if i%2 == 0 {
134-
nums[i] = nums[i>>1]
148+
nums[i] = nums[i/2]
135149
} else {
136-
nums[i] = nums[i>>1] + nums[(i>>1)+1]
150+
nums[i] = nums[i/2] + nums[i/2+1]
137151
}
152+
ans = max(ans, nums[i])
138153
}
139-
var ans int
140-
for _, num := range nums {
141-
ans = max(ans, num)
142-
}
143-
return ans
154+
return
144155
}
145156
146157
func max(a, b int) int {

solution/1600-1699/1646.Get Maximum in Generated Array/README_EN.md

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ Hence, nums = [0,1,1,2,1,3,2,3], and the maximum is max(0,1,1,2,1,3,2,3) = 3.
6565
```python
6666
class Solution:
6767
def getMaximumGenerated(self, n: int) -> int:
68-
if n == 0:
69-
return 0
68+
if n < 2:
69+
return n
7070
nums = [0] * (n + 1)
7171
nums[1] = 1
7272
for i in range(2, n + 1):
@@ -79,12 +79,12 @@ class Solution:
7979
```java
8080
class Solution {
8181
public int getMaximumGenerated(int n) {
82-
if (n == 0) {
83-
return 0;
82+
if (n < 2) {
83+
return n;
8484
}
8585
int[] nums = new int[n + 1];
8686
nums[1] = 1;
87-
for (int i = 2; i < n + 1; ++i) {
87+
for (int i = 2; i <= n; ++i) {
8888
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
8989
}
9090
return Arrays.stream(nums).max().getAsInt();
@@ -98,37 +98,38 @@ class Solution {
9898
class Solution {
9999
public:
100100
int getMaximumGenerated(int n) {
101-
if (n == 0) return 0;
102-
vector<int> ans(n + 1, 0);
103-
ans[1] = 1;
104-
for (int i = 2; i < n + 1; ++i)
105-
ans[i] = i % 2 == 0 ? ans[i >> 1] : ans[i >> 1] + ans[(i >> 1) + 1];
106-
return *max_element(ans.begin(), ans.end());
101+
if (n < 2) {
102+
return n;
103+
}
104+
int nums[n + 1];
105+
nums[0] = 0;
106+
nums[1] = 1;
107+
for (int i = 2; i <= n; ++i) {
108+
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
109+
}
110+
return *max_element(nums, nums + n + 1);
107111
}
108112
};
109113
```
110114
111115
### **Go**
112116
113117
```go
114-
func getMaximumGenerated(n int) int {
115-
if n == 0 {
116-
return 0
118+
func getMaximumGenerated(n int) (ans int) {
119+
if n < 2 {
120+
return n
117121
}
118122
nums := make([]int, n+1)
119123
nums[1] = 1
120124
for i := 2; i <= n; i++ {
121125
if i%2 == 0 {
122-
nums[i] = nums[i>>1]
126+
nums[i] = nums[i/2]
123127
} else {
124-
nums[i] = nums[i>>1] + nums[(i>>1)+1]
128+
nums[i] = nums[i/2] + nums[i/2+1]
125129
}
130+
ans = max(ans, nums[i])
126131
}
127-
var ans int
128-
for _, num := range nums {
129-
ans = max(ans, num)
130-
}
131-
return ans
132+
return
132133
}
133134
134135
func max(a, b int) int {
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
class Solution {
22
public:
33
int getMaximumGenerated(int n) {
4-
if (n == 0) return 0;
5-
vector<int> ans(n + 1, 0);
6-
ans[1] = 1;
7-
for (int i = 2; i < n + 1; ++i)
8-
ans[i] = i % 2 == 0 ? ans[i >> 1] : ans[i >> 1] + ans[(i >> 1) + 1];
9-
return *max_element(ans.begin(), ans.end());
4+
if (n < 2) {
5+
return n;
6+
}
7+
int nums[n + 1];
8+
nums[0] = 0;
9+
nums[1] = 1;
10+
for (int i = 2; i <= n; ++i) {
11+
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
12+
}
13+
return *max_element(nums, nums + n + 1);
1014
}
1115
};

solution/1600-1699/1646.Get Maximum in Generated Array/Solution.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
func getMaximumGenerated(n int) int {
2-
if n == 0 {
3-
return 0
1+
func getMaximumGenerated(n int) (ans int) {
2+
if n < 2 {
3+
return n
44
}
55
nums := make([]int, n+1)
66
nums[1] = 1
77
for i := 2; i <= n; i++ {
88
if i%2 == 0 {
9-
nums[i] = nums[i>>1]
9+
nums[i] = nums[i/2]
1010
} else {
11-
nums[i] = nums[i>>1] + nums[(i>>1)+1]
11+
nums[i] = nums[i/2] + nums[i/2+1]
1212
}
13+
ans = max(ans, nums[i])
1314
}
14-
var ans int
15-
for _, num := range nums {
16-
ans = max(ans, num)
17-
}
18-
return ans
15+
return
1916
}
2017

2118
func max(a, b int) int {

solution/1600-1699/1646.Get Maximum in Generated Array/Solution.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
class Solution {
22
public int getMaximumGenerated(int n) {
3-
if (n == 0) {
4-
return 0;
3+
if (n < 2) {
4+
return n;
55
}
66
int[] nums = new int[n + 1];
77
nums[1] = 1;
8-
for (int i = 2; i < n + 1; ++i) {
8+
for (int i = 2; i <= n; ++i) {
99
nums[i] = i % 2 == 0 ? nums[i >> 1] : nums[i >> 1] + nums[(i >> 1) + 1];
1010
}
1111
return Arrays.stream(nums).max().getAsInt();

solution/1600-1699/1646.Get Maximum in Generated Array/Solution.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class Solution:
22
def getMaximumGenerated(self, n: int) -> int:
3-
if n == 0:
4-
return 0
3+
if n < 2:
4+
return n
55
nums = [0] * (n + 1)
66
nums[1] = 1
77
for i in range(2, n + 1):
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
class Solution:
22
def vowelStrings(self, words: List[str], left: int, right: int) -> int:
3-
return sum(w[0] in 'aeiou' and w[-1] in 'aeiou' for w in words[left: right + 1])
3+
return sum(
4+
w[0] in 'aeiou' and w[-1] in 'aeiou' for w in words[left : right + 1]
5+
)

solution/2500-2599/2589.Minimum Time to Complete All Tasks/Solution.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ def findMinimumTime(self, tasks: List[List[int]]) -> int:
44
vis = [0] * 2010
55
ans = 0
66
for start, end, duration in tasks:
7-
duration -= sum(vis[start: end + 1])
7+
duration -= sum(vis[start : end + 1])
88
i = end
99
while i >= start and duration > 0:
1010
if not vis[i]:
1111
duration -= 1
1212
vis[i] = 1
1313
ans += 1
1414
i -= 1
15-
return ans
15+
return ans

0 commit comments

Comments
 (0)