52
52
53
53
** 方法一:预处理 + 枚举**
54
54
55
- 我们可以先预处理出数组 ` arr ` 以每个元素结尾和开头的最大子数组和,分别存入数组 ` left ` 和 ` right ` 中。然后枚举 ` arr ` 中的每个元素,如果删除该元素,则最大子数组和为 ` left[i - 1] + right[i + 1] ` 。最后取所有可能的最大值即可,注意也可能不删除任何元素 。
55
+ 我们可以先预处理出数组 $ arr$ 以每个元素结尾和开头的最大子数组和,分别存入数组 $ left$ 和 $ right$ 中 。
56
56
57
- 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 ` arr ` 的长度。
57
+ 如果我们不删除任何元素,那么最大子数组和就是 $left[ i] $ 或 $right[ i] $ 中的最大值;如果我们删除一个元素,我们可以枚举 $[ 1..n-2] $ 中的每个位置 $i$,计算 $left[ i-1] + right[ i+1] $ 的值,取最大值即可。
58
+
59
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $arr$ 的长度。
58
60
59
61
<!-- tabs:start -->
60
62
@@ -68,14 +70,14 @@ class Solution:
68
70
n = len (arr)
69
71
left = [0 ] * n
70
72
right = [0 ] * n
71
- t = 0
72
- for i, v in enumerate (arr):
73
- t = max (t , 0 ) + v
74
- left[i] = t
75
- t = 0
73
+ s = 0
74
+ for i, x in enumerate (arr):
75
+ s = max (s , 0 ) + x
76
+ left[i] = s
77
+ s = 0
76
78
for i in range (n - 1 , - 1 , - 1 ):
77
- t = max (t , 0 ) + arr[i]
78
- right[i] = t
79
+ s = max (s , 0 ) + arr[i]
80
+ right[i] = s
79
81
ans = max (left)
80
82
for i in range (1 , n - 1 ):
81
83
ans = max (ans, left[i - 1 ] + right[i + 1 ])
@@ -92,17 +94,16 @@ class Solution {
92
94
int n = arr. length;
93
95
int [] left = new int [n];
94
96
int [] right = new int [n];
95
- int t = 0 ;
96
- for (int i = 0 ; i < n; ++ i) {
97
- t = Math . max(t, 0 ) + arr[i];
98
- left[i] = t;
97
+ int ans = - (1 << 30 );
98
+ for (int i = 0 , s = 0 ; i < n; ++ i) {
99
+ s = Math . max(s, 0 ) + arr[i];
100
+ left[i] = s;
101
+ ans = Math . max(ans, left[i]);
99
102
}
100
- t = 0 ;
101
- for (int i = n - 1 ; i >= 0 ; -- i) {
102
- t = Math . max(t, 0 ) + arr[i];
103
- right[i] = t;
103
+ for (int i = n - 1 , s = 0 ; i >= 0 ; -- i) {
104
+ s = Math . max(s, 0 ) + arr[i];
105
+ right[i] = s;
104
106
}
105
- int ans = Arrays . stream(left). max(). getAsInt();
106
107
for (int i = 1 ; i < n - 1 ; ++ i) {
107
108
ans = Math . max(ans, left[i - 1 ] + right[i + 1 ]);
108
109
}
@@ -120,13 +121,13 @@ public:
120
121
int n = arr.size();
121
122
int left[ n] ;
122
123
int right[ n] ;
123
- for (int i = 0, t = 0; i < n; ++i) {
124
- t = max(t , 0) + arr[ i] ;
125
- left[ i] = t ;
124
+ for (int i = 0, s = 0; i < n; ++i) {
125
+ s = max(s , 0) + arr[ i] ;
126
+ left[ i] = s ;
126
127
}
127
- for (int i = n - 1, t = 0; ~ i; --i) {
128
- t = max(t , 0) + arr[ i] ;
129
- right[ i] = t ;
128
+ for (int i = n - 1, s = 0; ~ i; --i) {
129
+ s = max(s , 0) + arr[ i] ;
130
+ right[ i] = s ;
130
131
}
131
132
int ans = * max_element(left, left + n);
132
133
for (int i = 1; i < n - 1; ++i) {
@@ -144,17 +145,15 @@ func maximumSum(arr []int) int {
144
145
n := len(arr)
145
146
left := make([]int, n)
146
147
right := make([]int, n)
147
- t := 0
148
- ans := math.MinInt32
149
- for i, v := range arr {
150
- t = max(t, 0) + v
151
- left[i] = t
152
- ans = max(ans, left[i])
148
+ ans := -(1 << 30)
149
+ for i, s := 0, 0; i < n; i++ {
150
+ s = max(s, 0) + arr[i]
151
+ left[i] = s
152
+ ans = max(ans, s)
153
153
}
154
- t = 0
155
- for i := n - 1; i >= 0; i-- {
156
- t = max(t, 0) + arr[i]
157
- right[i] = t
154
+ for i, s := n-1, 0; i >= 0; i-- {
155
+ s = max(s, 0) + arr[i]
156
+ right[i] = s
158
157
}
159
158
for i := 1; i < n-1; i++ {
160
159
ans = max(ans, left[i-1]+right[i+1])
@@ -170,6 +169,29 @@ func max(a, b int) int {
170
169
}
171
170
```
172
171
172
+ ### ** TypeScript**
173
+
174
+ ``` ts
175
+ function maximumSum(arr : number []): number {
176
+ const n = arr .length ;
177
+ const left: number [] = new Array (n );
178
+ const right: number [] = new Array (n );
179
+ for (let i = 0 , s = 0 ; i < n ; ++ i ) {
180
+ s = Math .max (s , 0 ) + arr [i ];
181
+ left [i ] = s ;
182
+ }
183
+ for (let i = n - 1 , s = 0 ; i >= 0 ; -- i ) {
184
+ s = Math .max (s , 0 ) + arr [i ];
185
+ right [i ] = s ;
186
+ }
187
+ let ans = Math .max (... left );
188
+ for (let i = 1 ; i < n - 1 ; ++ i ) {
189
+ ans = Math .max (ans , left [i - 1 ] + right [i + 1 ]);
190
+ }
191
+ return ans ;
192
+ }
193
+ ```
194
+
173
195
### ** ...**
174
196
175
197
```
0 commit comments