Skip to content

Commit 882ce04

Browse files
committed
feat: add solutions to lc problem: No.1031
No.1031.Maximum Sum of Two Non-Overlapping Subarrays
1 parent 0b18e87 commit 882ce04

File tree

2 files changed

+228
-2
lines changed

2 files changed

+228
-2
lines changed

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

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
**方法一:前缀和 + 枚举**
5757

58-
我们先预处理得到数组 `nums` 的前缀和数组 $s$,其中 $s[i]$ 表示 $nums$ 中前 $i$ 个元素的和。
58+
我们先预处理得到数组 $nums$ 的前缀和数组 $s$,其中 $s[i]$ 表示 $nums$ 中前 $i$ 个元素的和。
5959

6060
接下来,我们分两种情况枚举:
6161

@@ -65,7 +65,9 @@
6565

6666
取两种情况下的最大值作为答案即可。
6767

68-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
68+
我们也可以将上面两个情况抽取成一个函数 $f(a, b)$,那么答案就是 $\max(f(firstLen, secondLen), f(secondLen, firstLen))$。
69+
70+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。
6971

7072
<!-- tabs:start -->
7173

@@ -93,6 +95,23 @@ class Solution:
9395
return ans
9496
```
9597

98+
```python
99+
class Solution:
100+
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
101+
def f(a: int, b: int) -> int:
102+
ans = t = 0
103+
i = a
104+
while i + b - 1 < n:
105+
t = max(t, s[i] - s[i - a])
106+
ans = max(ans, t + s[i + b] - s[i])
107+
i += 1
108+
return ans
109+
110+
n = len(nums)
111+
s = list(accumulate(nums, initial=0))
112+
return max(f(firstLen, secondLen), f(secondLen, firstLen))
113+
```
114+
96115
### **Java**
97116

98117
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -119,6 +138,31 @@ class Solution {
119138
}
120139
```
121140

141+
```java
142+
class Solution {
143+
private int[] s;
144+
private int n;
145+
146+
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
147+
n = nums.length;
148+
s = new int[n + 1];
149+
for (int i = 0; i < n; ++i) {
150+
s[i + 1] = s[i] + nums[i];
151+
}
152+
return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
153+
}
154+
155+
private int f(int a, int b) {
156+
int ans = 0;
157+
for (int i = a, t = 0; i + b - 1 < n; ++i) {
158+
t = Math.max(t, s[i] - s[i - a]);
159+
ans = Math.max(ans, t + s[i + b] - s[i]);
160+
}
161+
return ans;
162+
}
163+
}
164+
```
165+
122166
### **C++**
123167

124168
```cpp
@@ -144,6 +188,28 @@ public:
144188
};
145189
```
146190
191+
```cpp
192+
class Solution {
193+
public:
194+
int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
195+
int n = nums.size();
196+
vector<int> s(n + 1);
197+
for (int i = 0; i < n; ++i) {
198+
s[i + 1] = s[i] + nums[i];
199+
}
200+
auto f = [&](int a, int b) -> int {
201+
int ans = 0;
202+
for (int i = a, t = 0; i + b - 1 < n; ++i) {
203+
t = max(t, s[i] - s[i - a]);
204+
ans = max(ans, t + s[i + b] - s[i]);
205+
}
206+
return ans;
207+
};
208+
return max(f(firstLen, secondLen), f(secondLen, firstLen));
209+
}
210+
};
211+
```
212+
147213
### **Go**
148214

149215
```go
@@ -172,6 +238,31 @@ func max(a, b int) int {
172238
}
173239
```
174240

241+
```go
242+
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) (ans int) {
243+
n := len(nums)
244+
s := make([]int, n+1)
245+
for i, x := range nums {
246+
s[i+1] = s[i] + x
247+
}
248+
f := func(a, b int) (ans int) {
249+
for i, t := a, 0; i+b-1 < n; i++ {
250+
t = max(t, s[i]-s[i-a])
251+
ans = max(ans, t+s[i+b]-s[i])
252+
}
253+
return
254+
}
255+
return max(f(firstLen, secondLen), f(secondLen, firstLen))
256+
}
257+
258+
func max(a, b int) int {
259+
if a > b {
260+
return a
261+
}
262+
return b
263+
}
264+
```
265+
175266
### **TypeScript**
176267

177268
```ts
@@ -198,6 +289,29 @@ function maxSumTwoNoOverlap(
198289
}
199290
```
200291

292+
```ts
293+
function maxSumTwoNoOverlap(
294+
nums: number[],
295+
firstLen: number,
296+
secondLen: number,
297+
): number {
298+
const n = nums.length;
299+
const s: number[] = new Array(n + 1).fill(0);
300+
for (let i = 0; i < n; ++i) {
301+
s[i + 1] = s[i] + nums[i];
302+
}
303+
const f = (a: number, b: number): number => {
304+
let ans = 0;
305+
for (let i = a, t = 0; i + b - 1 < n; ++i) {
306+
t = Math.max(t, s[i] - s[i - a]);
307+
ans = Math.max(ans, t + s[i + b] - s[i]);
308+
}
309+
return ans;
310+
};
311+
return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
312+
}
313+
```
314+
201315
### **...**
202316

203317
```

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

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,23 @@ class Solution:
8585
return ans
8686
```
8787

88+
```python
89+
class Solution:
90+
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
91+
def f(a: int, b: int) -> int:
92+
ans = t = 0
93+
i = a
94+
while i + b - 1 < n:
95+
t = max(t, s[i] - s[i - a])
96+
ans = max(ans, t + s[i + b] - s[i])
97+
i += 1
98+
return ans
99+
100+
n = len(nums)
101+
s = list(accumulate(nums, initial=0))
102+
return max(f(firstLen, secondLen), f(secondLen, firstLen))
103+
```
104+
88105
### **Java**
89106

90107
```java
@@ -109,6 +126,31 @@ class Solution {
109126
}
110127
```
111128

129+
```java
130+
class Solution {
131+
private int[] s;
132+
private int n;
133+
134+
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
135+
n = nums.length;
136+
s = new int[n + 1];
137+
for (int i = 0; i < n; ++i) {
138+
s[i + 1] = s[i] + nums[i];
139+
}
140+
return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
141+
}
142+
143+
private int f(int a, int b) {
144+
int ans = 0;
145+
for (int i = a, t = 0; i + b - 1 < n; ++i) {
146+
t = Math.max(t, s[i] - s[i - a]);
147+
ans = Math.max(ans, t + s[i + b] - s[i]);
148+
}
149+
return ans;
150+
}
151+
}
152+
```
153+
112154
### **C++**
113155

114156
```cpp
@@ -134,6 +176,28 @@ public:
134176
};
135177
```
136178
179+
```cpp
180+
class Solution {
181+
public:
182+
int maxSumTwoNoOverlap(vector<int>& nums, int firstLen, int secondLen) {
183+
int n = nums.size();
184+
vector<int> s(n + 1);
185+
for (int i = 0; i < n; ++i) {
186+
s[i + 1] = s[i] + nums[i];
187+
}
188+
auto f = [&](int a, int b) -> int {
189+
int ans = 0;
190+
for (int i = a, t = 0; i + b - 1 < n; ++i) {
191+
t = max(t, s[i] - s[i - a]);
192+
ans = max(ans, t + s[i + b] - s[i]);
193+
}
194+
return ans;
195+
};
196+
return max(f(firstLen, secondLen), f(secondLen, firstLen));
197+
}
198+
};
199+
```
200+
137201
### **Go**
138202

139203
```go
@@ -162,6 +226,31 @@ func max(a, b int) int {
162226
}
163227
```
164228

229+
```go
230+
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) (ans int) {
231+
n := len(nums)
232+
s := make([]int, n+1)
233+
for i, x := range nums {
234+
s[i+1] = s[i] + x
235+
}
236+
f := func(a, b int) (ans int) {
237+
for i, t := a, 0; i+b-1 < n; i++ {
238+
t = max(t, s[i]-s[i-a])
239+
ans = max(ans, t+s[i+b]-s[i])
240+
}
241+
return
242+
}
243+
return max(f(firstLen, secondLen), f(secondLen, firstLen))
244+
}
245+
246+
func max(a, b int) int {
247+
if a > b {
248+
return a
249+
}
250+
return b
251+
}
252+
```
253+
165254
### **TypeScript**
166255

167256
```ts
@@ -188,6 +277,29 @@ function maxSumTwoNoOverlap(
188277
}
189278
```
190279

280+
```ts
281+
function maxSumTwoNoOverlap(
282+
nums: number[],
283+
firstLen: number,
284+
secondLen: number,
285+
): number {
286+
const n = nums.length;
287+
const s: number[] = new Array(n + 1).fill(0);
288+
for (let i = 0; i < n; ++i) {
289+
s[i + 1] = s[i] + nums[i];
290+
}
291+
const f = (a: number, b: number): number => {
292+
let ans = 0;
293+
for (let i = a, t = 0; i + b - 1 < n; ++i) {
294+
t = Math.max(t, s[i] - s[i - a]);
295+
ans = Math.max(ans, t + s[i + b] - s[i]);
296+
}
297+
return ans;
298+
};
299+
return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
300+
}
301+
```
302+
191303
### **...**
192304

193305
```

0 commit comments

Comments
 (0)