Skip to content

Commit 9127064

Browse files
committed
feat: add solutions to lc problem No.0053. Maximum Subarray
1 parent 067be61 commit 9127064

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed

solution/0000-0099/0053.Maximum Subarray/README.md

+79
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,30 @@
6464

6565
<!-- 这里可写通用的实现逻辑 -->
6666

67+
### 1. 动态规划
68+
6769
`dp[i]` 表示 `[0..i]` 中,以 `nums[i]` 结尾的最大子数组和,状态转移方程 `dp[i] = nums[i] + max(dp[i - 1], 0)`
6870

6971
由于 `dp[i]` 只与子问题 `dp[i-1]` 有关,故可以用一个变量 f 来表示。
7072

73+
### 2. 分治
74+
75+
最大子序和可能有三种情况:
76+
77+
1. 在数组左半部分
78+
1. 在数组右半部分
79+
1. 跨越左右半部分
80+
81+
递归求得三者,返回最大值即可。
82+
7183
<!-- tabs:start -->
7284

7385
### **Python3**
7486

7587
<!-- 这里可写当前语言的特殊实现逻辑 -->
7688

89+
动态规划:
90+
7791
```python
7892
class Solution:
7993
def maxSubArray(self, nums: List[int]) -> int:
@@ -84,10 +98,41 @@ class Solution:
8498
return res
8599
```
86100

101+
分治:
102+
103+
```python
104+
class Solution:
105+
def maxSubArray(self, nums: List[int]) -> int:
106+
def crossMaxSub(nums, left, mid, right):
107+
lsum = rsum = 0
108+
lmx = rmx = float('-inf')
109+
for i in range(mid, left - 1, -1):
110+
lsum += nums[i]
111+
lmx = max(lmx, lsum)
112+
for i in range(mid + 1, right + 1):
113+
rsum += nums[i]
114+
rmx = max(rmx, rsum)
115+
return lmx + rmx
116+
117+
def maxSub(nums, left, right):
118+
if left == right:
119+
return nums[left]
120+
mid = (left + right) >> 1
121+
lsum = maxSub(nums, left, mid)
122+
rsum = maxSub(nums, mid + 1, right)
123+
csum = crossMaxSub(nums, left, mid, right)
124+
return max(lsum, rsum, csum)
125+
126+
left, right = 0, len(nums) - 1
127+
return maxSub(nums, left, right)
128+
```
129+
87130
### **Java**
88131

89132
<!-- 这里可写当前语言的特殊实现逻辑 -->
90133

134+
动态规划:
135+
91136
```java
92137
class Solution {
93138
public int maxSubArray(int[] nums) {
@@ -101,6 +146,40 @@ class Solution {
101146
}
102147
```
103148

149+
分治:
150+
151+
```java
152+
class Solution {
153+
public int maxSubArray(int[] nums) {
154+
return maxSub(nums, 0, nums.length - 1);
155+
}
156+
157+
private int maxSub(int[] nums, int left, int right) {
158+
if (left == right) {
159+
return nums[left];
160+
}
161+
int mid = (left + right) >>> 1;
162+
int lsum = maxSub(nums, left, mid);
163+
int rsum = maxSub(nums, mid + 1, right);
164+
return Math.max(Math.max(lsum, rsum), crossMaxSub(nums, left, mid, right));
165+
}
166+
167+
private int crossMaxSub(int[] nums, int left, int mid, int right) {
168+
int lsum = 0, rsum = 0;
169+
int lmx = Integer.MIN_VALUE, rmx = Integer.MIN_VALUE;
170+
for (int i = mid; i >= left; --i) {
171+
lsum += nums[i];
172+
lmx = Math.max(lmx, lsum);
173+
}
174+
for (int i = mid + 1; i <= right; ++i) {
175+
rsum += nums[i];
176+
rmx = Math.max(rmx, rsum);
177+
}
178+
return lmx + rmx;
179+
}
180+
}
181+
```
182+
104183
### **C++**
105184

106185
```cpp

solution/0000-0099/0053.Maximum Subarray/README_EN.md

+71
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,16 @@
4242

4343
## Solutions
4444

45+
### 1. Dynamic programming
46+
47+
### 2. Divide and Conquer
48+
4549
<!-- tabs:start -->
4650

4751
### **Python3**
4852

53+
Dynamic programming.
54+
4955
```python
5056
class Solution:
5157
def maxSubArray(self, nums: List[int]) -> int:
@@ -56,8 +62,39 @@ class Solution:
5662
return res
5763
```
5864

65+
Divide and Conquer.
66+
67+
```python
68+
class Solution:
69+
def maxSubArray(self, nums: List[int]) -> int:
70+
def crossMaxSub(nums, left, mid, right):
71+
lsum = rsum = 0
72+
lmx = rmx = float('-inf')
73+
for i in range(mid, left - 1, -1):
74+
lsum += nums[i]
75+
lmx = max(lmx, lsum)
76+
for i in range(mid + 1, right + 1):
77+
rsum += nums[i]
78+
rmx = max(rmx, rsum)
79+
return lmx + rmx
80+
81+
def maxSub(nums, left, right):
82+
if left == right:
83+
return nums[left]
84+
mid = (left + right) >> 1
85+
lsum = maxSub(nums, left, mid)
86+
rsum = maxSub(nums, mid + 1, right)
87+
csum = crossMaxSub(nums, left, mid, right)
88+
return max(lsum, rsum, csum)
89+
90+
left, right = 0, len(nums) - 1
91+
return maxSub(nums, left, right)
92+
```
93+
5994
### **Java**
6095

96+
Dynamic programming.
97+
6198
```java
6299
class Solution {
63100
public int maxSubArray(int[] nums) {
@@ -71,6 +108,40 @@ class Solution {
71108
}
72109
```
73110

111+
Divide and Conquer.
112+
113+
```java
114+
class Solution {
115+
public int maxSubArray(int[] nums) {
116+
return maxSub(nums, 0, nums.length - 1);
117+
}
118+
119+
private int maxSub(int[] nums, int left, int right) {
120+
if (left == right) {
121+
return nums[left];
122+
}
123+
int mid = (left + right) >>> 1;
124+
int lsum = maxSub(nums, left, mid);
125+
int rsum = maxSub(nums, mid + 1, right);
126+
return Math.max(Math.max(lsum, rsum), crossMaxSub(nums, left, mid, right));
127+
}
128+
129+
private int crossMaxSub(int[] nums, int left, int mid, int right) {
130+
int lsum = 0, rsum = 0;
131+
int lmx = Integer.MIN_VALUE, rmx = Integer.MIN_VALUE;
132+
for (int i = mid; i >= left; --i) {
133+
lsum += nums[i];
134+
lmx = Math.max(lmx, lsum);
135+
}
136+
for (int i = mid + 1; i <= right; ++i) {
137+
rsum += nums[i];
138+
rmx = Math.max(rmx, rsum);
139+
}
140+
return lmx + rmx;
141+
}
142+
}
143+
```
144+
74145
### **C++**
75146

76147
```cpp

0 commit comments

Comments
 (0)