贪心算法:如果当前数字之前得到的和为负数时应该抛弃并清零,因为这个负数将会减少接下来的和
注意maxSum是在maxSum和curSum之间挑最大的,局部最优以实现全局最优
takeaway: 这里可以思考怎么实现丢弃的?curSum+nums[i]-nums[i]<0, 则curSum<0那我的curSum只取当前值,意味着丢弃之前小于0的和,与当前值nums[i]的大小无关;
也可以这么理解:如果在加总当前值之前的curSum<0,Math.max取的一定是nums[i],因为curSum+nums[i]一定小于nums[i]
动态规划:虽然官方说这是动态规划,对我来说更像另一种贪心思路,前一个元素大于0?
takeaway: 为什么把前一个大于0的元素加总在当前元素上取最大值就是最大子序和(当前元素可以是负值)?
如果想清楚了你就是贪心(因为这是你的贪心选择),没想清楚就是动态规划
动态规划的思路:第i个元素结尾且最大的子序和要么是第i-1个元素结尾且最大的子序和+当前元素,要么是当前元素(如果当前元素是正数),即
sum[i]=max(sum[i-1]+nums[i], nums[i]), 即可以通过判断sum[i-1]+nums[i]是否大于nums[i]来做判断,即等价于判断sum[i-1]是否大于0,在代码中即判断nums[i-1]是否大于0(代码中是加总前一个大于0的元素到当前元素)
或这么理解:nums[i]保存的是以数字nums[i]为结尾的最大子序和,只有前面一个元素不为负数则有利于加进来以更新最大值(这是我本人理解的)
这里注意区分子序和子数组(子串)的区别:子序是不连续的;
回溯枚举:即所谓的暴力搜索法
这是最原始的思路
回溯枚举:改善后的暴力搜索法
分治法: