Leetcode 最大子序和
这道题目是紫书上的经典题目,位于分治那一部分前后,再做这题依然觉得很巧妙。
分析:1.要明白的是,使用的是连续的一段,如果我统计i到j的和为负数,那肯定要舍去,因为他会对后面的答案有负面的作用,还不如不买,也就是将当前统计的区间和归零。
2.我们确实会遇到中间连续的一段可能存在负数,区间的和下降的情况。但是只要他还是大于0即可,我们每次加上一个数,区间的和仍然大于0,则和答案比较一下看谁大,如果比答案大则更新一下。
3.上面两种情况一直建立在和大于0的情况,极端情况下如果全部都小于0呢?题目要求必须选一个,肯定要选负数中最大那个。可以采取特判的方法,也可以直接将答案从int的最小值开始更新。
class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.size() == 0) return 0; int ans = -0x7fffffff;//再-1才是最小的,即0x80000000 for(int i = 0, sum = 0; i < nums.size(); ++i) { sum += nums[i]; if(sum > ans) ans = sum; if(sum < 0) sum = 0; } return ans; } };