Skip to content

Commit 7391828

Browse files
committed
feat: add solutions to lc problem: No.1031
No.1031.Maximum Sum of Two Non-Overlapping Subarrays
1 parent 57ae8cd commit 7391828

File tree

6 files changed

+235
-63
lines changed

6 files changed

+235
-63
lines changed

solution/1000-1099/1031.Maximum Sum of Two Non-Overlapping Subarrays/README.md

+91-21
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:前缀和 + 枚举**
61+
62+
我们先预处理得到数组 `nums` 的前缀和数组 $s$,其中 $s[i]$ 表示 $nums$ 中前 $i$ 个元素的和。
63+
64+
接下来,我们分两种情况枚举:
65+
66+
假设 $firstLen$ 个元素的子数组在 $secondLen$ 个元素的子数组的左边,那么我们可以枚举 $secondLen$ 个元素的子数组的左端点 $i$,用变量 $t$ 维护左边 $firstLen$ 个元素的子数组的最大和,那么答案就是 $t + s[i + secondLen] - s[i]$。枚举完所有的 $i$,就可以得到候选答案。
67+
68+
假设 $secondLen$ 个元素的子数组在 $firstLen$ 个元素的子数组的左边,那么我们可以枚举 $firstLen$ 个元素的子数组的左端点 $i$,用变量 $t$ 维护左边 $secondLen$ 个元素的子数组的最大和,那么答案就是 $t + s[i + firstLen] - s[i]$。枚举完所有的 $i$,就可以得到候选答案。
69+
70+
最后,我们取两种情况下的候选答案的最大值即可。
71+
72+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
73+
6074
<!-- tabs:start -->
6175

6276
### **Python3**
@@ -67,17 +81,20 @@
6781
class Solution:
6882
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
6983
n = len(nums)
70-
s = [0] * (n + 1)
71-
for i in range(1, n + 1):
72-
s[i] = s[i - 1] + nums[i - 1]
73-
ans1, ans2, fm, sm = 0, 0, 0, 0
74-
for i in range(n - firstLen - secondLen + 1):
75-
fm = max(fm, s[i + firstLen] - s[i])
76-
ans1 = max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1)
77-
for i in range(n - firstLen - secondLen + 1):
78-
sm = max(sm, s[i + secondLen] - s[i])
79-
ans2 = max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2)
80-
return max(ans1, ans2)
84+
s = list(accumulate(nums, initial=0))
85+
ans = t = 0
86+
i = firstLen
87+
while i + secondLen - 1 < n:
88+
t = max(t, s[i] - s[i - firstLen])
89+
ans = max(ans, t + s[i + secondLen] - s[i])
90+
i += 1
91+
t = 0
92+
i = secondLen
93+
while i + firstLen - 1 < n:
94+
t = max(t, s[i] - s[i - secondLen])
95+
ans = max(ans, t + s[i + firstLen] - s[i])
96+
i += 1
97+
return ans
8198
```
8299

83100
### **Java**
@@ -89,20 +106,73 @@ class Solution {
89106
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
90107
int n = nums.length;
91108
int[] s = new int[n + 1];
92-
for (int i = 1; i <= n; i++) {
93-
s[i] = s[i - 1] + nums[i - 1];
109+
for (int i = 0; i < n; ++i) {
110+
s[i + 1] = s[i] + nums[i];
111+
}
112+
int ans = 0;
113+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
114+
t = Math.max(t, s[i] - s[i - firstLen]);
115+
ans = Math.max(ans, t + s[i + secondLen] - s[i]);
116+
}
117+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
118+
t = Math.max(t, s[i] - s[i - secondLen]);
119+
ans = Math.max(ans, t + s[i + firstLen] - s[i]);
120+
}
121+
return ans;
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
132+
int n = nums.size();
133+
vector<int> s(n + 1);
134+
for (int i = 0; i < n; ++i) {
135+
s[i + 1] = s[i] + nums[i];
94136
}
95-
int ans1 = 0, ans2 = 0, fm = 0, sm = 0;
96-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
97-
fm = Math.max(s[i + firstLen] - s[i], fm);
98-
ans1 = Math.max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1);
137+
int ans = 0;
138+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
139+
t = max(t, s[i] - s[i - firstLen]);
140+
ans = max(ans, t + s[i + secondLen] - s[i]);
99141
}
100-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
101-
sm = Math.max(s[i + secondLen] - s[i], sm);
102-
ans2 = Math.max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2);
142+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
143+
t = max(t, s[i] - s[i - secondLen]);
144+
ans = max(ans, t + s[i + firstLen] - s[i]);
103145
}
104-
return Math.max(ans1, ans2);
146+
return ans;
105147
}
148+
};
149+
```
150+
151+
### **Go**
152+
153+
```go
154+
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) (ans int) {
155+
n := len(nums)
156+
s := make([]int, n+1)
157+
for i, x := range nums {
158+
s[i+1] = s[i] + x
159+
}
160+
for i, t := firstLen, 0; i+secondLen-1 < n; i++ {
161+
t = max(t, s[i]-s[i-firstLen])
162+
ans = max(ans, t+s[i+secondLen]-s[i])
163+
}
164+
for i, t := secondLen, 0; i+firstLen-1 < n; i++ {
165+
t = max(t, s[i]-s[i-secondLen])
166+
ans = max(ans, t+s[i+firstLen]-s[i])
167+
}
168+
return
169+
}
170+
171+
func max(a, b int) int {
172+
if a > b {
173+
return a
174+
}
175+
return b
106176
}
107177
```
108178

solution/1000-1099/1031.Maximum Sum of Two Non-Overlapping Subarrays/README_EN.md

+77-21
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,20 @@
5555
class Solution:
5656
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
5757
n = len(nums)
58-
s = [0] * (n + 1)
59-
for i in range(1, n + 1):
60-
s[i] = s[i - 1] + nums[i - 1]
61-
ans1, ans2, fm, sm = 0, 0, 0, 0
62-
for i in range(n - firstLen - secondLen + 1):
63-
fm = max(fm, s[i + firstLen] - s[i])
64-
ans1 = max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1)
65-
for i in range(n - firstLen - secondLen + 1):
66-
sm = max(sm, s[i + secondLen] - s[i])
67-
ans2 = max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2)
68-
return max(ans1, ans2)
58+
s = list(accumulate(nums, initial=0))
59+
ans = t = 0
60+
i = firstLen
61+
while i + secondLen - 1 < n:
62+
t = max(t, s[i] - s[i - firstLen])
63+
ans = max(ans, t + s[i + secondLen] - s[i])
64+
i += 1
65+
t = 0
66+
i = secondLen
67+
while i + firstLen - 1 < n:
68+
t = max(t, s[i] - s[i - secondLen])
69+
ans = max(ans, t + s[i + firstLen] - s[i])
70+
i += 1
71+
return ans
6972
```
7073

7174
### **Java**
@@ -75,23 +78,76 @@ class Solution {
7578
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
7679
int n = nums.length;
7780
int[] s = new int[n + 1];
78-
for (int i = 1; i <= n; i++) {
79-
s[i] = s[i - 1] + nums[i - 1];
81+
for (int i = 0; i < n; ++i) {
82+
s[i + 1] = s[i] + nums[i];
8083
}
81-
int ans1 = 0, ans2 = 0, fm = 0, sm = 0;
82-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
83-
fm = Math.max(s[i + firstLen] - s[i], fm);
84-
ans1 = Math.max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1);
84+
int ans = 0;
85+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
86+
t = Math.max(t, s[i] - s[i - firstLen]);
87+
ans = Math.max(ans, t + s[i + secondLen] - s[i]);
8588
}
86-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
87-
sm = Math.max(s[i + secondLen] - s[i], sm);
88-
ans2 = Math.max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2);
89+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
90+
t = Math.max(t, s[i] - s[i - secondLen]);
91+
ans = Math.max(ans, t + s[i + firstLen] - s[i]);
8992
}
90-
return Math.max(ans1, ans2);
93+
return ans;
9194
}
9295
}
9396
```
9497

98+
### **C++**
99+
100+
```cpp
101+
class Solution {
102+
public:
103+
int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
104+
int n = nums.size();
105+
vector<int> s(n + 1);
106+
for (int i = 0; i < n; ++i) {
107+
s[i + 1] = s[i] + nums[i];
108+
}
109+
int ans = 0;
110+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
111+
t = max(t, s[i] - s[i - firstLen]);
112+
ans = max(ans, t + s[i + secondLen] - s[i]);
113+
}
114+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
115+
t = max(t, s[i] - s[i - secondLen]);
116+
ans = max(ans, t + s[i + firstLen] - s[i]);
117+
}
118+
return ans;
119+
}
120+
};
121+
```
122+
123+
### **Go**
124+
125+
```go
126+
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) (ans int) {
127+
n := len(nums)
128+
s := make([]int, n+1)
129+
for i, x := range nums {
130+
s[i+1] = s[i] + x
131+
}
132+
for i, t := firstLen, 0; i+secondLen-1 < n; i++ {
133+
t = max(t, s[i]-s[i-firstLen])
134+
ans = max(ans, t+s[i+secondLen]-s[i])
135+
}
136+
for i, t := secondLen, 0; i+firstLen-1 < n; i++ {
137+
t = max(t, s[i]-s[i-secondLen])
138+
ans = max(ans, t+s[i+firstLen]-s[i])
139+
}
140+
return
141+
}
142+
143+
func max(a, b int) int {
144+
if a > b {
145+
return a
146+
}
147+
return b
148+
}
149+
```
150+
95151
### **...**
96152

97153
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
4+
int n = nums.size();
5+
vector<int> s(n + 1);
6+
for (int i = 0; i < n; ++i) {
7+
s[i + 1] = s[i] + nums[i];
8+
}
9+
int ans = 0;
10+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
11+
t = max(t, s[i] - s[i - firstLen]);
12+
ans = max(ans, t + s[i + secondLen] - s[i]);
13+
}
14+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
15+
t = max(t, s[i] - s[i - secondLen]);
16+
ans = max(ans, t + s[i + firstLen] - s[i]);
17+
}
18+
return ans;
19+
}
20+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) (ans int) {
2+
n := len(nums)
3+
s := make([]int, n+1)
4+
for i, x := range nums {
5+
s[i+1] = s[i] + x
6+
}
7+
for i, t := firstLen, 0; i+secondLen-1 < n; i++ {
8+
t = max(t, s[i]-s[i-firstLen])
9+
ans = max(ans, t+s[i+secondLen]-s[i])
10+
}
11+
for i, t := secondLen, 0; i+firstLen-1 < n; i++ {
12+
t = max(t, s[i]-s[i-secondLen])
13+
ans = max(ans, t+s[i+firstLen]-s[i])
14+
}
15+
return
16+
}
17+
18+
func max(a, b int) int {
19+
if a > b {
20+
return a
21+
}
22+
return b
23+
}

solution/1000-1099/1031.Maximum Sum of Two Non-Overlapping Subarrays/Solution.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ class Solution {
22
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
33
int n = nums.length;
44
int[] s = new int[n + 1];
5-
for (int i = 1; i <= n; i++) {
6-
s[i] = s[i - 1] + nums[i - 1];
5+
for (int i = 0; i < n; ++i) {
6+
s[i + 1] = s[i] + nums[i];
77
}
8-
int ans1 = 0, ans2 = 0, fm = 0, sm = 0;
9-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
10-
fm = Math.max(s[i + firstLen] - s[i], fm);
11-
ans1 = Math.max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1);
8+
int ans = 0;
9+
for (int i = firstLen, t = 0; i + secondLen - 1 < n; ++i) {
10+
t = Math.max(t, s[i] - s[i - firstLen]);
11+
ans = Math.max(ans, t + s[i + secondLen] - s[i]);
1212
}
13-
for (int i = 0; i < n - firstLen - secondLen + 1; i++) {
14-
sm = Math.max(s[i + secondLen] - s[i], sm);
15-
ans2 = Math.max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2);
13+
for (int i = secondLen, t = 0; i + firstLen - 1 < n; ++i) {
14+
t = Math.max(t, s[i] - s[i - secondLen]);
15+
ans = Math.max(ans, t + s[i + firstLen] - s[i]);
1616
}
17-
return Math.max(ans1, ans2);
17+
return ans;
1818
}
1919
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
class Solution:
22
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
33
n = len(nums)
4-
s = [0] * (n + 1)
5-
for i in range(1, n + 1):
6-
s[i] = s[i - 1] + nums[i - 1]
7-
ans1, ans2, fm, sm = 0, 0, 0, 0
8-
for i in range(n - firstLen - secondLen + 1):
9-
fm = max(fm, s[i + firstLen] - s[i])
10-
ans1 = max(fm + s[i + firstLen + secondLen] - s[i + firstLen], ans1)
11-
for i in range(n - firstLen - secondLen + 1):
12-
sm = max(sm, s[i + secondLen] - s[i])
13-
ans2 = max(sm + s[i + firstLen + secondLen] - s[i + secondLen], ans2)
14-
return max(ans1, ans2)
4+
s = list(accumulate(nums, initial=0))
5+
ans = t = 0
6+
i = firstLen
7+
while i + secondLen - 1 < n:
8+
t = max(t, s[i] - s[i - firstLen])
9+
ans = max(ans, t + s[i + secondLen] - s[i])
10+
i += 1
11+
t = 0
12+
i = secondLen
13+
while i + firstLen - 1 < n:
14+
t = max(t, s[i] - s[i - secondLen])
15+
ans = max(ans, t + s[i + firstLen] - s[i])
16+
i += 1
17+
return ans

0 commit comments

Comments
 (0)