Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
最简单的o(1)空间复杂度的动态规划,但是还可以用分制做,当然,用分制做并不优秀,但是一个很新奇的点子:
方法一:dp
public class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==0) return 0;
int sum=nums[0];
int re=sum;
for(int i=1;i<nums.length;i++){
if(sum<=0) sum=0;
sum+=nums[i];
re=Math.max(re,sum);
}
return re;
}
}
方法二:分制
public class Solution2 {
//不是很好的做法
public int maxSubArray(int[] nums) {
if(nums.length==0) return 0;
return merge(nums,0,nums.length-1);
}
private int merge(int[] nums, int l, int r) {
if(l==r) return nums[l];
int mid=(l+r)/2;
int leftRe=merge(nums,l,mid);
int rightRe=merge(nums,mid+1,r);
int left=Integer.MIN_VALUE,right=Integer.MIN_VALUE;
int sum=0;
for(int i=mid;i>=l;i--){ //注意细节 这里是从mid到l 不是到0
sum+=nums[i];
left=Math.max(sum,left);
}
sum=0;
for(int i=mid+1;i<=r;i++){
sum+=nums[i];
right=Math.max(sum,right);
}
int re=left+right;
return Math.max(re,Math.max(leftRe,rightRe));
}
}