[leetCode] Maximum Subarray

本文介绍了两种求解最大子数组和的方法:动态规划和分治法。动态规划方法使用O(1)空间复杂度实现,而分治法则提供了一种新颖但效率较低的选择。文章通过代码示例详细解释了这两种方法。

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));
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值