int maxSubArray(vector<int>& nums) {int len = nums.size();int max=INT_MIN;int sum=0;for(int i=0;i<len;i++){sum+=nums[i];if(max<sum) max=sum;if(sum<0) sum=0;}return max;}
这是根据代码的写出的max与sum的状态,笔者认为最重要的一点在于理解连续和sum。
本题的贪心策略是:先比较max与sum的大小并视状态更新(因为有全部数都是负数的可能),然后判断sum的正负性,如果sum小于0便直接舍去当前sum值,也就是图中两个箭头指向的位置。
其实这样看更像是将sum与max视为判断条件来进行子数组的分割,因为sum在每次归零的时候都可以看作是将前面的数作为子数组求出最大子数组和,而由于子数组必须是连续的,当前的sum小于零只会让下一个数变小,所以不如直接舍弃前面的子数组,专注于后面的数组是否可以有更大值,但这并不代表前面的数组和就一定比后面的要小,而是使用了max来记录了所有子数组中最大的值,最后进行输出。