57
57
58
58
<!-- 这里可写通用的实现逻辑 -->
59
59
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
+
60
74
<!-- tabs:start -->
61
75
62
76
### ** Python3**
67
81
class Solution :
68
82
def maxSumTwoNoOverlap (self , nums : List[int ], firstLen : int , secondLen : int ) -> int :
69
83
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
81
98
```
82
99
83
100
### ** Java**
@@ -89,20 +106,73 @@ class Solution {
89
106
public int maxSumTwoNoOverlap (int [] nums , int firstLen , int secondLen ) {
90
107
int n = nums. length;
91
108
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] ;
94
136
}
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] );
99
141
}
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] );
103
145
}
104
- return Math . max(ans1, ans2) ;
146
+ return ans ;
105
147
}
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
106
176
}
107
177
```
108
178
0 commit comments