Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
题目
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/im…
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
思路分析
- 第一步,确定初始值pre和 maxAns初始最大值
- 第二步,循环遍历数据
- 遍历数据需要寻找两个值,第一个是pre,第二个就是最大值maxAns
- pre的值产生的方式,分别是比较prx+x的值与x对比,选大的
- maxAns的产生是比较 pre的值与maxAns比较,选大的
- 所以pre的产生是这样的
- 如上数组
- 第一次循环
-
pre=0, x=-2 => 因为要找出最大的连续子串,所以比较的事 prx+x 与x -
那么得到的最大值就是-2 -
maxAns初始值是num[0],所以maxAns的最大是-2 - 第二次循环
-
pre = -2, x = 1, pre+x => -1 比较 x=1 => pre = 1 -
比较pre=1 与maxAns=-2 ,得到maxAns = 1 - 第三次循环
-
pre = 1, x=-3, pre+x = -2 => pre = -2 -
pre = -2, maxAns = 1 => maxAns = 1 - 第四次:
-
pre = -2, x = 4, pre+x = 2, => pre = 4 -
pre = 4, maxAns = 1 => maxAns = 4 - 第五次
-
pre = 4, x= -1, pre +x = 3 => pre = 3 -
pre = 3, maxAns = 4 => maxAns = 4 - 第六次
-
pre = 3, x = 2, pre +x = 5 => pre = 5 -
pre = 5, maxAns = 4 => maxAns = 5 - 第七次
-
pre = 5, x = 1, pre +x = 6 => pre = 6 -
pre = 6, maxAns = 5 => maxAns = 6 - 第八次
-
pre = 6, x = -5, pre +x = 1 => pre = 1 -
pre = 1, maxAns = 6 => maxAns = 6 - 第九次
-
pre = 1, x = 4, pre +x = 5 => pre = 5 -
pre = 5, maxAns = 6 => maxAns = 6 - 最终返回最大值maxAns
代码
let nums = [-2,1,-3,4,-1,2,1,-5,4]
let maxSubArray = function(nums) {
/**
* 第一步,确定初始值pre和 maxAns初始最大值
* 第二步,循环遍历数据
* 遍历数据需要寻找两个值,第一个是pre,第二个就是最大值maxAns
* pre的值产生的方式,分别是比较prx+x的值与x对比,选大的
* maxAns的产生是比较 pre的值与maxAns比较,选大的
* 所以pre的产生是这样的
* 如上数组
* 第一次循环
* pre=0, x=-2 => 因为要找出最大的连续子串,所以比较的事 prx+x 与x
* 那么得到的最大值就是-2
* maxAns初始值是num[0],所以maxAns的最大是-2
* 第二次循环
* pre = -2, x = 1, pre+x => -1 比较 x=1 => pre = 1
* 比较pre=1 与maxAns=-2 ,得到maxAns = 1
* 第三次循环
* pre = 1, x=-3, pre+x = -2 => pre = -2
* pre = -2, maxAns = 1 => maxAns = 1
* 第四次:
* pre = -2, x = 4, pre+x = 2, => pre = 4
* pre = 4, maxAns = 1 => maxAns = 4
* 第五次
* pre = 4, x= -1, pre +x = 3 => pre = 3
* pre = 3, maxAns = 4 => maxAns = 4
* 第六次
* pre = 3, x = 2, pre +x = 5 => pre = 5
* pre = 5, maxAns = 4 => maxAns = 5
* 第七次
* pre = 5, x = 1, pre +x = 6 => pre = 6
* pre = 6, maxAns = 5 => maxAns = 6
* 第八次
* pre = 6, x = -5, pre +x = 1 => pre = 1
* pre = 1, maxAns = 6 => maxAns = 6
* 第九次
* pre = 1, x = 4, pre +x = 5 => pre = 5
* pre = 5, maxAns = 6 => maxAns = 6
*
* 最终返回最大值maxAns
*
* */
let pre = 0, maxAns = nums[0];
nums.forEach((x) => {
console.log(`x=${x}`)
pre = Math.max(pre + x, x);
console.log(`pre=${pre}`)
maxAns = Math.max(maxAns, pre);
console.log(`maxAns=${maxAns}`)
});
return maxAns;
}
maxSubArray(nums)