(Java)LeetCode-53. Maximum Subarray

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.

More practice:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.


这题就是非常经典的求最大子序列的问题。首先是O(n)的解法。从前向后遍历数组,一旦加上某个点之后和变成负数,那么就需要从这个数之后重新开始累加。保存最大值即可。更详细的讲解可见《数据结构与算法分析 第一章》代码如下:

public int maxSubArray(int[] nums) {
		int max = Integer.MIN_VALUE;
		int temp = 0;
		for(int num : nums){
			temp += num;
			if(temp > max){
				max = temp;
			}
			if(temp < 0){
				temp = 0;
			}
		}
		return max;
}

题目里还要求用分治算法来求解,简单来说就是1.先算出左半部分的最大子序列 2.再算出右半部分最大子序列 3.算出横跨左右的最大子序列

其中前两部分可以递归求解,第三部分先算左半部分以最后一个数结尾的最大子序列,再算后半部分以第一个数开头的最大子序列,加起来即可。代码如下:



	public int maxSubArray(int[] nums) {
		
		return maxSubArray(nums, 0, nums.length-1);
    }
	
	private int maxSubArray(int[] nums, int left, int right) {
		// TODO Auto-generated method stub
		if(left == right){
				return nums[left];
		}
		
		int maxLeftSubArray = maxSubArray(nums, left, (right+left)/2);
		int maxRightSubArray = maxSubArray(nums, (right+left)/2+1, right);
		
		int maxLeftBoardArray = nums[(right+left)/2], tempLeft = 0;
		for(int i = (right + left)/2; i >= left; i--){
			tempLeft += nums[i];
			if(tempLeft > maxLeftBoardArray){
				maxLeftBoardArray = tempLeft;
			}
		}
		
		int maxRightBoardArray = nums[(right+left)/2+1], tempRight = 0;
		for(int i = (right + left)/2 + 1; i <= right; i++){
			tempRight += nums[i];
			if(tempRight > maxRightBoardArray){
				maxRightBoardArray = tempRight;
			}
		}
		
		int maxMidArray = maxLeftBoardArray + maxRightBoardArray;
		if(maxLeftSubArray >= maxRightSubArray){
			if( maxLeftSubArray > maxMidArray){
				return maxLeftSubArray;
			}else{
				return maxMidArray;
			}
		}else{
			if(maxRightSubArray > maxMidArray){
				return maxRightSubArray;
			}else{
				return maxMidArray;
			}
		}
	}
	public static void main(String[] args){
    	Solution sol = new Solution();
    	
    	System.out.println("start");
    	int[] arr = {-2,1,-3,4,-1,2,1,-5,4};
    	System.out.println(sol.maxSubArray(arr));
    	
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值