Skip to content

Commit 60ed231

Browse files
committed
add: 53. 最大子数组和
1 parent a0051f5 commit 60ed231

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

max.js

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/**
2+
* 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
3+
* 子数组 是数组中的一个连续部分。
4+
* 示例 1:
5+
* 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
6+
* 输出:6
7+
* 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
8+
* 示例 2:
9+
* 输入:nums = [1]
10+
* 输出:1
11+
* 示例 3:
12+
* 输入:nums = [5,4,-1,7,8]
13+
* 输出:23
14+
* 提示:
15+
* 1 <= nums.length <= 105
16+
* -104 <= nums[i] <= 104
17+
* 进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
18+
*/
19+
20+
/**
21+
* @param {number[]} nums
22+
* @return {number}
23+
*/
24+
var maxSubArray = function (nums) {
25+
const obj = {};
26+
const garr = [];
27+
const result = nums
28+
.map((item, index) => {
29+
let arrResult = [];
30+
for (let i = nums.length; i >= index; i--) {
31+
const arr = nums.slice(index, i);
32+
const _r = arr.reduce((acc, item) => item + acc, 0);
33+
arrResult.push(_r);
34+
garr.push(arr);
35+
obj[_r] = arr;
36+
}
37+
return arrResult;
38+
})
39+
.flat();
40+
41+
const max = Math.max(...result);
42+
return max;
43+
};
44+
45+
/**
46+
* 核心思路是将当前元素定义为连续子数组的最后一个元素。
47+
* dp[i]:表示以 nums[i] 结尾 的 连续 子数组的最大和。
48+
* dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i]
49+
* @param {number[]} nums
50+
* @return {number}
51+
*/
52+
var maxSubArray2 = function (nums) {
53+
let len = nums.length;
54+
let dep = [];
55+
dep[0] = nums[0];
56+
57+
for (let i = 1; i < len; i++) {
58+
let cur = nums[i];
59+
if (dep[i - 1] <= 0) {
60+
dep[i] = cur;
61+
} else {
62+
dep[i] = dep[i - 1] + cur;
63+
}
64+
}
65+
let res = 0
66+
for (const value of dep) {
67+
res = Math.max(res, value)
68+
}
69+
return res
70+
};
71+
72+
const result = maxSubArray2([-2, 1, -3, 4, -1, 2, 1, -5, 4]);
73+
console.log("result", result);

0 commit comments

Comments
 (0)