Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0c0082b

Browse files
committed
feat:最大子序和题目解
1 parent 2cddf77 commit 0c0082b

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

动态规划/最大子序和-53.js

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,63 @@
22
* @param {number[]} nums
33
* @return {number}
44
*/
5-
let maxSubArray = function(nums) {
5+
var maxSubArray = function (nums) {
66
let n = nums.length;
77
let dp = [];
8-
8+
// 代表以第 n-1个数结尾的「连续子数组的最大和」
99
dp[n - 1] = nums[n - 1];
1010

1111
for (let i = n - 2; i >= 0; i--) {
1212
let pickSelf = nums[i];
1313
let pickWithNext = pickSelf + dp[i + 1];
14-
// TODO: 为什么 如果[0,1,2,3,-999] 和 3拼在一起,不就会把-999意外地塞进来吗?? 看不懂
1514
dp[i] = Math.max(pickSelf, pickWithNext);
1615
}
1716

1817
return Math.max(...dp);
19-
};
18+
};
19+
20+
/**
21+
* @param {number[]} nums
22+
* @return {number}
23+
* @时间复杂度 O(N)
24+
* @空间复杂度 O(N)
25+
*/
26+
var maxSubArray = function (nums) {
27+
let len = nums.length;
28+
if (!len) {
29+
return 0;
30+
}
31+
let dp = [];
32+
// 代表以第 n-1个数结尾的「连续子数组的最大和」
33+
dp[0] = nums[0];
34+
for (let i = 1; i < len; i++) {
35+
let cur = nums[i];
36+
let prev = dp[i - 1];
37+
dp[i] = prev < 0 ? nums[i] : prev + nums[i];
38+
}
39+
40+
return Math.max(...dp);
41+
};
42+
/**
43+
* @param {number[]} nums
44+
* @return {number}
45+
* @时间复杂度 O(N)
46+
* @空间复杂度 O(1)
47+
*/
48+
var maxSubArray = function (nums) {
49+
let len = nums.length;
50+
if (!len) {
51+
return 0;
52+
}
53+
// let dp = []
54+
// 代表以第 n-1个数结尾的「连续子数组的最大和」
55+
let res = (prev = nums[0]);
56+
for (let i = 1; i < len; i++) {
57+
let cur = nums[i];
58+
// let prev = dp[i - 1]
59+
prev = prev < 0 ? cur : prev + cur;
60+
res = Math.max(res, prev);
61+
}
62+
63+
return res;
64+
};

0 commit comments

Comments
 (0)