找求和最大子串
Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
最开始就写的最最最直接的方式= = 不出意外地超时了。。。
后来看了各个博客后用的思路是:
Ai记为以数组第i个数为结尾的最大求和子串
以input为例[-2,1,-3,4,-1,2,1,-5,4]
A0 = -2
A1计算时,在nums[1]上的数字是固定的,因此,如果以nums[1]为结尾的最大求和子串要么是nums[1]+A0,要么是nums[1]本身(如果A0>0,则nums[1]+A0必然是比nums[1]大,如果A0<0,则nums[1]本身就是最大子串)
对Ai和Ai+1同理,求得Ai后要求Ai+1,则用Ai+nums[i+1]与nums[i+1]进行对比,更大者为当前位置的最大求和子串的求和值——代码中由max记录
每个位置会得到一次新的max,用retu来记录最大的max用于返回
eg:[-2,1,-3,4,-1,2,1,-5,4]
max = nums[0]=-2 retu = -2 从1的位置开始(0的位置,以nums[0]为结尾的子串只有它自己)
loc 1: max+nums[1] = -2+1=-1 < 1 → max = 1 retu = 1
loc 2 : max+nums[2] = 1+(-3) = -2 > -3 →max = -2 retu =1
loc 3 : max+nums[3] = -2+4=2<4 →max = 4 retu = 4
loc 4 : max+nums[4] = 4-1=3>-1 →max = 3 retu=4
loc 5 : max+nums[5] = 3+2=5>4 →max=5 retu=5
loc 6 : max+nums[6] = 5+1=6>5 →max=6 retu=6
loc 7 : max+nums[7] = 6-5=1>-5 →max=1 retu=6
loc 8 : max+nums[8] = 1+4=5>4 →max=5 retu=6
注意:需要判断数组长度
public int maxSubArray(int[] nums) {
if(nums.length==0){
return 0;
}
int len = nums.length;
int max = nums[0];
int retu = max;
for(int i=1;i<len;i++) {
if(max+nums[i]>nums[i]) {
max = nums[i]+max;
}else {
max = nums[i];
}
if(retu<max) {
retu = max;
}
}
return retu;
}