LeetCode 53. Maximum Subarray

本文介绍了一种求解连续子数组最大和的算法,通过动态规划思想,以O(n)的时间复杂度找到给定数组中具有最大和的连续子数组。文章详细解释了算法的实现过程,并给出了具体示例。

找求和最大子串

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

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

最开始就写的最最最直接的方式=  = 不出意外地超时了。。。

 

后来看了各个博客后用的思路是:

Ai记为以数组第i个数为结尾的最大求和子串

以input为例[-2,1,-3,4,-1,2,1,-5,4]

A0 = -2

A1计算时,在nums[1]上的数字是固定的,因此,如果以nums[1]为结尾的最大求和子串要么是nums[1]+A0,要么是nums[1]本身(如果A0>0,则nums[1]+A0必然是比nums[1]大,如果A0<0,则nums[1]本身就是最大子串)

对Ai和Ai+1同理,求得Ai后要求Ai+1,则用Ai+nums[i+1]与nums[i+1]进行对比,更大者为当前位置的最大求和子串的求和值——代码中由max记录

每个位置会得到一次新的max,用retu来记录最大的max用于返回

 

eg:[-2,1,-3,4,-1,2,1,-5,4]

max = nums[0]=-2    retu = -2        从1的位置开始(0的位置,以nums[0]为结尾的子串只有它自己)

loc 1:  max+nums[1] = -2+1=-1 < 1  → max = 1   retu = 1

loc 2 : max+nums[2] = 1+(-3) = -2 > -3  →max = -2    retu =1

loc 3 : max+nums[3] = -2+4=2<4   →max = 4  retu = 4

loc 4 : max+nums[4] = 4-1=3>-1   →max = 3  retu=4

loc 5 : max+nums[5] = 3+2=5>4   →max=5  retu=5

loc 6 : max+nums[6] = 5+1=6>5   →max=6  retu=6

loc 7 : max+nums[7] = 6-5=1>-5   →max=1  retu=6

loc 8 : max+nums[8] = 1+4=5>4   →max=5 retu=6

注意:需要判断数组长度

public int maxSubArray(int[] nums) {
        if(nums.length==0){
            return 0;
        }
        
        int len = nums.length;
		int max = nums[0];
		int retu = max;
		for(int i=1;i<len;i++) {
			if(max+nums[i]>nums[i]) {
				max = nums[i]+max;
			}else {
				max = nums[i];
			}
            
			if(retu<max) {
				retu = max;
			}
		}
		return retu;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值