【Leetcode】53. Maximum Subarray(Easy)

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.

翻译:找到一个序列(至少包含一个数字)中的连续子序列,该子序列有最大的和。

例如,给定数组 [-2,1,-3,4,-1,2,1,-5,4],一个连续的子序列[4,-1,2,1] 有最大的和 6.

2.思路

nums为待求数组,用total记录当前遍历的加和,max记录当前计算的子串和最大值,对数组进行遍历。

①用total+nums[i]和nums[i]进行比较,如果nums[i]较大,则将total置为nums[i],否则total为total+nums[i]。也就是说当 

当前的数值 > 其与前面的加和时,直接用当前数值开始计算,会获得最大子串和。

②将total与max进行比较,max取其中最大值。

PS:使用total的原因是,可能存在4,-1,8这样的子串,即时total(=4)+(-1)=3比4小,但还是要继续遍历下去,否则错过了+8的机会。此外,max不能初始化为0,应初始化为数组的首元素。否则[-2,-1]这样的输入返回是错误的。

3.算法

public int maxSubArray(int[] nums) {
        
        if(nums.length==1)
            return nums[0];
        
        int total=0;
        int max=nums[0];
        
        for(int i=0;i<nums.length;i++){
            total=total+nums[i]<nums[i]?nums[i]:total+nums[i];
            max=max>total?max:total;
        }
        
        return max;
    }
4.总结

 我在做算法题时首先想到的解决办法都是暴力循环,这样经常会导致超时。应该进行更深入的分析而后再开始编程,算法的正确性和高效性都是重要因素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值