Skip to content

Commit 51a9923

Browse files
committed
feat: add solutions to lc problem: No.1186
No.1186.Maximum Subarray Sum with One Deletion
1 parent b2ac492 commit 51a9923

File tree

7 files changed

+155
-98
lines changed

7 files changed

+155
-98
lines changed

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/README.md

+56-34
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@
5252

5353
**方法一:预处理 + 枚举**
5454

55-
我们可以先预处理出数组 `arr` 以每个元素结尾和开头的最大子数组和,分别存入数组 `left``right` 中。然后枚举 `arr` 中的每个元素,如果删除该元素,则最大子数组和为 `left[i - 1] + right[i + 1]`。最后取所有可能的最大值即可,注意也可能不删除任何元素
55+
我们可以先预处理出数组 $arr$ 以每个元素结尾和开头的最大子数组和,分别存入数组 $left$$right$ 中
5656

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$ 的长度。
5860

5961
<!-- tabs:start -->
6062

@@ -68,14 +70,14 @@ class Solution:
6870
n = len(arr)
6971
left = [0] * n
7072
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
7678
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
7981
ans = max(left)
8082
for i in range(1, n - 1):
8183
ans = max(ans, left[i - 1] + right[i + 1])
@@ -92,17 +94,16 @@ class Solution {
9294
int n = arr.length;
9395
int[] left = new int[n];
9496
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]);
99102
}
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;
104106
}
105-
int ans = Arrays.stream(left).max().getAsInt();
106107
for (int i = 1; i < n - 1; ++i) {
107108
ans = Math.max(ans, left[i - 1] + right[i + 1]);
108109
}
@@ -120,13 +121,13 @@ public:
120121
int n = arr.size();
121122
int left[n];
122123
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;
126127
}
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;
130131
}
131132
int ans = *max_element(left, left + n);
132133
for (int i = 1; i < n - 1; ++i) {
@@ -144,17 +145,15 @@ func maximumSum(arr []int) int {
144145
n := len(arr)
145146
left := make([]int, n)
146147
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)
153153
}
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
158157
}
159158
for i := 1; i < n-1; i++ {
160159
ans = max(ans, left[i-1]+right[i+1])
@@ -170,6 +169,29 @@ func max(a, b int) int {
170169
}
171170
```
172171

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+
173195
### **...**
174196

175197
```

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/README_EN.md

+52-32
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ class Solution:
5252
n = len(arr)
5353
left = [0] * n
5454
right = [0] * n
55-
t = 0
56-
for i, v in enumerate(arr):
57-
t = max(t, 0) + v
58-
left[i] = t
59-
t = 0
55+
s = 0
56+
for i, x in enumerate(arr):
57+
s = max(s, 0) + x
58+
left[i] = s
59+
s = 0
6060
for i in range(n - 1, -1, -1):
61-
t = max(t, 0) + arr[i]
62-
right[i] = t
61+
s = max(s, 0) + arr[i]
62+
right[i] = s
6363
ans = max(left)
6464
for i in range(1, n - 1):
6565
ans = max(ans, left[i - 1] + right[i + 1])
@@ -74,17 +74,16 @@ class Solution {
7474
int n = arr.length;
7575
int[] left = new int[n];
7676
int[] right = new int[n];
77-
int t = 0;
78-
for (int i = 0; i < n; ++i) {
79-
t = Math.max(t, 0) + arr[i];
80-
left[i] = t;
77+
int ans = -(1 << 30);
78+
for (int i = 0, s = 0; i < n; ++i) {
79+
s = Math.max(s, 0) + arr[i];
80+
left[i] = s;
81+
ans = Math.max(ans, left[i]);
8182
}
82-
t = 0;
83-
for (int i = n - 1; i >= 0; --i) {
84-
t = Math.max(t, 0) + arr[i];
85-
right[i] = t;
83+
for (int i = n - 1, s = 0; i >= 0; --i) {
84+
s = Math.max(s, 0) + arr[i];
85+
right[i] = s;
8686
}
87-
int ans = Arrays.stream(left).max().getAsInt();
8887
for (int i = 1; i < n - 1; ++i) {
8988
ans = Math.max(ans, left[i - 1] + right[i + 1]);
9089
}
@@ -102,13 +101,13 @@ public:
102101
int n = arr.size();
103102
int left[n];
104103
int right[n];
105-
for (int i = 0, t = 0; i < n; ++i) {
106-
t = max(t, 0) + arr[i];
107-
left[i] = t;
104+
for (int i = 0, s = 0; i < n; ++i) {
105+
s = max(s, 0) + arr[i];
106+
left[i] = s;
108107
}
109-
for (int i = n - 1, t = 0; ~i; --i) {
110-
t = max(t, 0) + arr[i];
111-
right[i] = t;
108+
for (int i = n - 1, s = 0; ~i; --i) {
109+
s = max(s, 0) + arr[i];
110+
right[i] = s;
112111
}
113112
int ans = *max_element(left, left + n);
114113
for (int i = 1; i < n - 1; ++i) {
@@ -126,17 +125,15 @@ func maximumSum(arr []int) int {
126125
n := len(arr)
127126
left := make([]int, n)
128127
right := make([]int, n)
129-
t := 0
130-
ans := math.MinInt32
131-
for i, v := range arr {
132-
t = max(t, 0) + v
133-
left[i] = t
134-
ans = max(ans, left[i])
128+
ans := -(1 << 30)
129+
for i, s := 0, 0; i < n; i++ {
130+
s = max(s, 0) + arr[i]
131+
left[i] = s
132+
ans = max(ans, s)
135133
}
136-
t = 0
137-
for i := n - 1; i >= 0; i-- {
138-
t = max(t, 0) + arr[i]
139-
right[i] = t
134+
for i, s := n-1, 0; i >= 0; i-- {
135+
s = max(s, 0) + arr[i]
136+
right[i] = s
140137
}
141138
for i := 1; i < n-1; i++ {
142139
ans = max(ans, left[i-1]+right[i+1])
@@ -152,6 +149,29 @@ func max(a, b int) int {
152149
}
153150
```
154151

152+
### **TypeScript**
153+
154+
```ts
155+
function maximumSum(arr: number[]): number {
156+
const n = arr.length;
157+
const left: number[] = new Array(n);
158+
const right: number[] = new Array(n);
159+
for (let i = 0, s = 0; i < n; ++i) {
160+
s = Math.max(s, 0) + arr[i];
161+
left[i] = s;
162+
}
163+
for (let i = n - 1, s = 0; i >= 0; --i) {
164+
s = Math.max(s, 0) + arr[i];
165+
right[i] = s;
166+
}
167+
let ans = Math.max(...left);
168+
for (let i = 1; i < n - 1; ++i) {
169+
ans = Math.max(ans, left[i - 1] + right[i + 1]);
170+
}
171+
return ans;
172+
}
173+
```
174+
155175
### **...**
156176

157177
```

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/Solution.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ class Solution {
44
int n = arr.size();
55
int left[n];
66
int right[n];
7-
for (int i = 0, t = 0; i < n; ++i) {
8-
t = max(t, 0) + arr[i];
9-
left[i] = t;
7+
for (int i = 0, s = 0; i < n; ++i) {
8+
s = max(s, 0) + arr[i];
9+
left[i] = s;
1010
}
11-
for (int i = n - 1, t = 0; ~i; --i) {
12-
t = max(t, 0) + arr[i];
13-
right[i] = t;
11+
for (int i = n - 1, s = 0; ~i; --i) {
12+
s = max(s, 0) + arr[i];
13+
right[i] = s;
1414
}
1515
int ans = *max_element(left, left + n);
1616
for (int i = 1; i < n - 1; ++i) {

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/Solution.go

+8-10
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ func maximumSum(arr []int) int {
22
n := len(arr)
33
left := make([]int, n)
44
right := make([]int, n)
5-
t := 0
6-
ans := math.MinInt32
7-
for i, v := range arr {
8-
t = max(t, 0) + v
9-
left[i] = t
10-
ans = max(ans, left[i])
5+
ans := -(1 << 30)
6+
for i, s := 0, 0; i < n; i++ {
7+
s = max(s, 0) + arr[i]
8+
left[i] = s
9+
ans = max(ans, s)
1110
}
12-
t = 0
13-
for i := n - 1; i >= 0; i-- {
14-
t = max(t, 0) + arr[i]
15-
right[i] = t
11+
for i, s := n-1, 0; i >= 0; i-- {
12+
s = max(s, 0) + arr[i]
13+
right[i] = s
1614
}
1715
for i := 1; i < n-1; i++ {
1816
ans = max(ans, left[i-1]+right[i+1])

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/Solution.java

+8-9
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@ public int maximumSum(int[] arr) {
33
int n = arr.length;
44
int[] left = new int[n];
55
int[] right = new int[n];
6-
int t = 0;
7-
for (int i = 0; i < n; ++i) {
8-
t = Math.max(t, 0) + arr[i];
9-
left[i] = t;
6+
int ans = -(1 << 30);
7+
for (int i = 0, s = 0; i < n; ++i) {
8+
s = Math.max(s, 0) + arr[i];
9+
left[i] = s;
10+
ans = Math.max(ans, left[i]);
1011
}
11-
t = 0;
12-
for (int i = n - 1; i >= 0; --i) {
13-
t = Math.max(t, 0) + arr[i];
14-
right[i] = t;
12+
for (int i = n - 1, s = 0; i >= 0; --i) {
13+
s = Math.max(s, 0) + arr[i];
14+
right[i] = s;
1515
}
16-
int ans = Arrays.stream(left).max().getAsInt();
1716
for (int i = 1; i < n - 1; ++i) {
1817
ans = Math.max(ans, left[i - 1] + right[i + 1]);
1918
}

solution/1100-1199/1186.Maximum Subarray Sum with One Deletion/Solution.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ def maximumSum(self, arr: List[int]) -> int:
33
n = len(arr)
44
left = [0] * n
55
right = [0] * n
6-
t = 0
7-
for i, v in enumerate(arr):
8-
t = max(t, 0) + v
9-
left[i] = t
10-
t = 0
6+
s = 0
7+
for i, x in enumerate(arr):
8+
s = max(s, 0) + x
9+
left[i] = s
10+
s = 0
1111
for i in range(n - 1, -1, -1):
12-
t = max(t, 0) + arr[i]
13-
right[i] = t
12+
s = max(s, 0) + arr[i]
13+
right[i] = s
1414
ans = max(left)
1515
for i in range(1, n - 1):
1616
ans = max(ans, left[i - 1] + right[i + 1])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function maximumSum(arr: number[]): number {
2+
const n = arr.length;
3+
const left: number[] = new Array(n);
4+
const right: number[] = new Array(n);
5+
for (let i = 0, s = 0; i < n; ++i) {
6+
s = Math.max(s, 0) + arr[i];
7+
left[i] = s;
8+
}
9+
for (let i = n - 1, s = 0; i >= 0; --i) {
10+
s = Math.max(s, 0) + arr[i];
11+
right[i] = s;
12+
}
13+
let ans = Math.max(...left);
14+
for (let i = 1; i < n - 1; ++i) {
15+
ans = Math.max(ans, left[i - 1] + right[i + 1]);
16+
}
17+
return ans;
18+
}

0 commit comments

Comments
 (0)