最大子数组和(力扣53)

这道题的贪心贪在何处呢?当我们发现当前的子数组和已经为负数时,就要立马清0,因为继续加的话,一定会让后面的数字变小,这样一定无法达到题目要求的最大子数组和。我们需要用变量将局部的子数组和存储起来,并且随着遍历的进行,每当我们求得更大的局部最大子数组和时就更新该变量,最终该变量的值就是最大子数组和。需要注意的是我们给存储子数组的和的变量初始化时一定是用INT_MIN,千万不要习惯性初始化为0,原因是: 如果输入用例都是-1,或者 都是负数,那么最大的子数组和一定是其中最大的负数。    大家可以结合我下面的代码及注释理解此

代码及详细注释如下:
 

class Solution {
public:
    int maxSubArray(vector& nums) {
        int sum = 0;
        int result = INT_MIN;//初始化为最小的负数
        for(int i = 0;i < nums.size();i++){
            sum += nums[i];
            //实时更新局部最大子数组和
            if(sum > result){
                result = sum;
            }
            //清0子数组和
            if(sum < 0){
                sum = 0;
            }
        }
        return result;
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)