[leetCode] Maximum Subarray

来源:互联网 发布:高清油画 知乎 编辑:程序博客网 时间:2024/05/22 23:58

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  不是到0sum+=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));}}



原创粉丝点击