最大子序和|刷题打卡

87 阅读1分钟

前言

本文正在参与掘金团队号上线活动,点击查看大厂春招职位

题目

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

示例 1:

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

题解

这题解题关键是用了贪心算法,把它分成求一块一块的最优解。

1、设置一个变量ans用来存放最终返回的最大和,将其初始值设为nums[0], 设置一个变量sum用来存放局部分区的最大和,设置其初始值为0.

2、遍历数组,如果sum > 0,那么就相加。否则sum就重新开始计算,把当前遍历的数字设置为sum。

3、将ans设置为之前的ans和现在的sum的最大值。

4、返回ans。

AC代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let ans = nums[0];
    let sum = 0;

    for (const num of nums) {
        if (sum > 0) {
            sum += num;
        } else {
            sum = num;
        }

        ans = Math.max(ans, sum);
    }

    return ans;
};

总结

这道题的巧妙之处就是分区,如果一旦sum小于0了,那么就重新开始赋值,不再累加。有人可能要问,那如果数组里都是负值呢?都是负值就不会累加啊,直接进行赋值操作,然后取最大值,相当于找出数组中的最大值。