LeetCode(53):最大子序和 Maximum Subarray(Java)

234 篇文章 1 订阅
177 篇文章 0 订阅

2019.6.17 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

这是经典的数据结构与算法的入门题,也是我刷的第一道题,第一次打开了分治和DP的大门,原来算法是这么神奇的东西。

#数据结构与算法学习笔记#PTA4:分治算法求最大子列和(C/C++)

#数据结构与算法学习笔记#PTA3:在线处理算法求最大子列和,并返回最大子列和头尾元素(C/C++)(2004年浙大计科考研复试)


传送门:最大子序和

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

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

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。


/**
 * 
 * @author ChopinXBP
 * Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
 * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
 *
 */

public class MaximumSubarray {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums = {-2 , 1};
		int[] nums2 = {-2 , -1};
		System.out.println(maxSubArray(nums));
		System.out.println(maxSubArray(nums2));
	}
	
	//在线处理
	public static int maxSubArray(int[] nums) {
    	int result = nums[0];
    	int maxsubSum = 0;
    	for(int i = 0; i < nums.length; i++) {
    		maxsubSum += nums[i];
    		if(maxsubSum > result) {
    			result = maxsubSum;
    		}
    		if(maxsubSum < 0) {
    			maxsubSum = 0;
    		}
    	}
    	return result;
    }
		
	//分治算法
    public static int maxSubArray2(int[] nums) {
    	return Solution(nums, 0, nums.length - 1);
    }
    
    public static int MaxofThree(int a, int b, int c) {
    	return a > b ? (a > c ? a : c) : (b > c ? b : c);
    }
    
    public static int Solution(int[] nums, int begin, int end) {
    	if(begin == end) {
    		return nums[begin];
    	}
    	
    	int mid = (begin + end) >> 1;
    	int maxleftNum = Solution(nums, begin, mid);		//递归求左子列的最大子列和
    	int maxrightNum = Solution(nums, mid + 1, end);		//递归求右子列的最大子列和
    	
    	int leftSum = 0, maxmidleft = nums[mid];
    	for(int i = mid; i >= begin; i--) {
    		leftSum += nums[i];
    		if(leftSum > maxmidleft) {
    			maxmidleft = leftSum;
    		}
    	}
    	int rightSum = 0, maxmidright = nums[mid + 1];
    	for(int i = mid + 1; i <= end; i++) {
    		rightSum += nums[i];
    		if(rightSum > maxmidright) {
    			maxmidright = rightSum;
    		}
    	}
    	
    	return MaxofThree(maxleftNum, maxrightNum, maxmidleft + maxmidright);
    	
    }
}




#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值