题目描述
- 经典题目了,多种解法(不过目前只学了一种,暴力不算)
代码 & 思路
这块基本上算是写给自己看的了。。写得不好,如果想学这种方法最好还是去leetcode题解看。
- sum = num:因为在上一次循环结尾,就已经取得了i-1结尾的子序的最大和,也就是[0, i-1]的任务已经完成了,继续使用无意义,因为sum < 0的情况下,只会对后面的子序带来负增益
- 例子1:1,2 ,-4,1, -1,首先取到最大值【1,2】,然后【1,2,-4】时,【1,2,-4】已经无意义,接下来只要对剩下的【1,-1】进行判断即可。
原因:首先从2开始的【2,-4】肯定不如之前的【1,2,-4】大,因为之所以2之前的【1】能连上2,就是因为【1】这一部分是不小于0的,有正增益。然后之所以不能取【2,-4】再连上后面的【1,-1】,是因为这肯定还不如【1,2,-4】,原理基本上同上(前面的起码还是正增益,舍掉了得比现在还小)。
class Solution {
public int maxSubArray(int[] nums) {
int ans = nums[0];
int sum = 0;
// 使用动态规划:时间复杂度O(n)
for(int num : nums){
// 取值,然后舍掉(因为不如不加)
if(sum < 0){
sum = num;
}
// 否则继续下去
else{
sum += num;
}
ans = Math.max(ans,sum);
}
return ans;
}
}
- 时间复杂度O(n),一次遍历结束
- 空间复杂度O(1)