Leetcode 53. 最大子数组和

50 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

1.题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入: nums = [1]
输出: 1
输入: nums = [5,4,-1,7,8]
输出: 23

2.思路

本题需要我们找到连续的子数组并且是具有最大和。那么如何找到这个子数组呢,我们可以考虑使用动态规划,找到每个位置的最大值,然后再对最大值进行比较。而每个位置的最大值则是它之前最大值与它本身相加后和它本身的比较。

那我们为什么不使用滑动窗口来解决这个问题呢,当大于当前值时扩大右窗口,小于当前值时缩减左窗口,因为我们需要求最大和,而滑动窗口的滑动并不能保证当前值一定是最大的,因为没法确认左右窗口滑动的临界值。

我们可以理解为,如果前置连续数组的最大和加上当前数字小于之前的最大和,那也只能说明到当前数字的最大和是这一个,也许加上后面的数字依然能够获取更大,所以我们可以计算比较出每个位置的最大数字,然后遍历一遍整个数组,就可以得到当前最大连续子数组和。

3.代码

var maxSubArray = function(nums) {
    //当前和以及当前最大和
    let pre = 0, maxAns = nums[0];
    nums.forEach((x) => {
        //比较出当前和
        pre = Math.max(pre + x, x);
        //比较是否更新到最大和
        maxAns = Math.max(maxAns, pre);
    });
    return maxAns;
};