Skip to content

Commit 79e0f76

Browse files
committed
feat: update leetcode solutions: No.0053. Maximum Subarray
1 parent b368a09 commit 79e0f76

File tree

7 files changed

+142
-93
lines changed

7 files changed

+142
-93
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152

153153
### 动态规划
154154

155+
- [爬楼梯](/solution/0000-0099/0070.Climbing%20Stairs/README.md)
155156
- [接雨水](/solution/0000-0099/0042.Trapping%20Rain%20Water/README.md)
156157
- [最大子序和](/solution/0000-0099/0053.Maximum%20Subarray/README.md)
157158
- [乘积最大子序列](/solution/0100-0199/0152.Maximum%20Product%20Subarray/README.md)

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
146146

147147
### Dynamic Programming
148148

149+
- [Climbing Stairs](/solution/0000-0099/0070.Climbing%20Stairs/README_EN.md)
149150
- [Trapping Rain Water](/solution/0000-0099/0042.Trapping%20Rain%20Water/README_EN.md)
150151
- [Maximum Subarray](/solution/0000-0099/0053.Maximum%20Subarray/README_EN.md)
151152
- [Maximum Product Subarray](/solution/0100-0199/0152.Maximum%20Product%20Subarray/README_EN.md)

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

+56-1
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
<p>如果你已经实现复杂度为 O(<em>n</em>) 的解法,尝试使用更为精妙的分治法求解。</p>
2020

21+
[剑指 Offer 42. 连续子数组的最大和](/lcof/面试题42.%20连续子数组的最大和/README.md)
22+
2123
## 解法
2224

2325
<!-- 这里可写通用的实现逻辑 -->
2426

25-
设 dp[i] 表示 `[0..i]` 中,以 `nums[i]` 结尾的最大子数组和,状态转移方程 `dp[i] = nums[i] + max(dp[i - 1], 0)`
27+
`dp[i]` 表示 `[0..i]` 中,以 `nums[i]` 结尾的最大子数组和,状态转移方程 `dp[i] = nums[i] + max(dp[i - 1], 0)`
2628

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

@@ -60,6 +62,59 @@ class Solution {
6062
}
6163
```
6264

65+
### **C++**
66+
67+
```cpp
68+
class Solution {
69+
public:
70+
int maxSubArray(vector<int>& nums) {
71+
int f = nums[0], res = nums[0];
72+
for (int i = 1; i < nums.size(); ++i) {
73+
f = nums[i] + max(f, 0);
74+
res = max(res, f);
75+
}
76+
return res;
77+
}
78+
};
79+
```
80+
81+
### **JavaScript**
82+
83+
```js
84+
/**
85+
* @param {number[]} nums
86+
* @return {number}
87+
*/
88+
var maxSubArray = function (nums) {
89+
let f = nums[0],
90+
res = nums[0];
91+
for (let i = 1; i < nums.length; ++i) {
92+
f = nums[i] + Math.max(f, 0);
93+
res = Math.max(res, f);
94+
}
95+
return res;
96+
};
97+
```
98+
99+
### **Go**
100+
101+
```go
102+
func maxSubArray(nums []int) int {
103+
f, res := nums[0], nums[0]
104+
for i := 1; i < len(nums); i++ {
105+
if f > 0 {
106+
f += nums[i]
107+
} else {
108+
f = nums[i]
109+
}
110+
if f > res {
111+
res = f
112+
}
113+
}
114+
return res
115+
}
116+
```
117+
63118
### **...**
64119

65120
```

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

+53
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,59 @@ class Solution {
5454
}
5555
```
5656

57+
### **C++**
58+
59+
```cpp
60+
class Solution {
61+
public:
62+
int maxSubArray(vector<int>& nums) {
63+
int f = nums[0], res = nums[0];
64+
for (int i = 1; i < nums.size(); ++i) {
65+
f = nums[i] + max(f, 0);
66+
res = max(res, f);
67+
}
68+
return res;
69+
}
70+
};
71+
```
72+
73+
### **JavaScript**
74+
75+
```js
76+
/**
77+
* @param {number[]} nums
78+
* @return {number}
79+
*/
80+
var maxSubArray = function (nums) {
81+
let f = nums[0],
82+
res = nums[0];
83+
for (let i = 1; i < nums.length; ++i) {
84+
f = nums[i] + Math.max(f, 0);
85+
res = Math.max(res, f);
86+
}
87+
return res;
88+
};
89+
```
90+
91+
### **Go**
92+
93+
```go
94+
func maxSubArray(nums []int) int {
95+
f, res := nums[0], nums[0]
96+
for i := 1; i < len(nums); i++ {
97+
if f > 0 {
98+
f += nums[i]
99+
} else {
100+
f = nums[i]
101+
}
102+
if f > res {
103+
res = f
104+
}
105+
}
106+
return res
107+
}
108+
```
109+
57110
### **...**
58111

59112
```
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,11 @@
1-
/*
2-
* @lc app=leetcode.cn id=53 lang=cpp
3-
*
4-
* [53] 最大子序和
5-
*
6-
* https://leetcode-cn.com/problems/maximum-subarray/description/
7-
*
8-
* algorithms
9-
* Easy (46.59%)
10-
* Likes: 2144
11-
* Dislikes: 0
12-
* Total Accepted: 270.6K
13-
* Total Submissions: 524.4K
14-
* Testcase Example: '[-2,1,-3,4,-1,2,1,-5,4]'
15-
*
16-
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
17-
*
18-
* 示例:
19-
*
20-
* 输入: [-2,1,-3,4,-1,2,1,-5,4],
21-
* 输出: 6
22-
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
23-
*
24-
*
25-
* 进阶:
26-
*
27-
* 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
28-
*
29-
*/
30-
31-
#include <vector>
32-
33-
using std::vector;
34-
35-
// 贪心
36-
class Solution0 {
37-
public:
38-
int maxSubArray(vector<int>& nums) {
39-
if (nums.size() == 0) {
40-
return 0;
41-
}
42-
int result = nums[0];
43-
int temp = nums[0];
44-
for (int i = 1; i < nums.size(); i++) {
45-
if (temp >= 0) {
46-
temp += nums[i];
47-
} else {
48-
temp = nums[i];
49-
}
50-
result = std::max(result, temp);
51-
}
52-
return result;
53-
}
54-
};
55-
56-
// @lc code=start
57-
// 动态规划
581
class Solution {
59-
public:
2+
public:
603
int maxSubArray(vector<int>& nums) {
61-
if (nums.size() == 0) {
62-
return 0;
63-
}
64-
vector<int> dp = vector<int>(nums.size());
65-
dp[0] = nums[0];
66-
int result = nums[0];
67-
for (int i = 1; i < nums.size(); i++) {
68-
dp[i] = std::max(dp[i - 1] + nums[i], nums[i]);
69-
result = std::max(dp[i], result);
4+
int f = nums[0], res = nums[0];
5+
for (int i = 1; i < nums.size(); ++i) {
6+
f = nums[i] + max(f, 0);
7+
res = max(res, f);
708
}
71-
return result;
9+
return res;
7210
}
73-
};
74-
// @lc code=end
11+
};
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
func maxSubArray(nums []int) int {
2-
ans := nums[0]
3-
sum := 0
4-
for _, n := range nums {
5-
if sum > 0 {
6-
sum += n
7-
} else {
8-
sum = n
9-
}
10-
if sum > ans {
11-
ans = sum
12-
}
13-
}
14-
return ans
15-
}
2+
f, res := nums[0], nums[0]
3+
for i := 1; i < len(nums); i++ {
4+
if f > 0 {
5+
f += nums[i]
6+
} else {
7+
f = nums[i]
8+
}
9+
if f > res {
10+
res = f
11+
}
12+
}
13+
return res
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
const maxSubArray = function (nums) {
2-
if (nums.length === 0) return 0;
3-
let ans = nums[0],
4-
tmp = nums[0];
5-
for (let i = 1; i < nums.length; i++) {
6-
tmp = Math.max(tmp + nums[i], nums[i]);
7-
ans = Math.max(ans, tmp);
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
*/
5+
var maxSubArray = function (nums) {
6+
let f = nums[0],
7+
res = nums[0];
8+
for (let i = 1; i < nums.length; ++i) {
9+
f = nums[i] + Math.max(f, 0);
10+
res = Math.max(res, f);
811
}
9-
return ans;
12+
return res;
1013
};

0 commit comments

Comments
 (0)