leetcode53 Maximum Subarray

easy list的第五题,这个题蛮有意思的。

我贴出来test case 1

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

其实这个主要步骤就是找最大,从左向右,从右向左都一样。如果和大于其他和,那么这个和就是最大的,如果和小于值,那这个值或许就是最大的,极端点的例子[-1,-2,-3,-4,1,-3,-2]。恐怕最大子数组应该就是3了。写成代码逻辑基本是:

sum+=nums[i]

nums[i]>sum max=nums[i]

Math.max(sum, max)

其实应该可以写成Math.max(max, Math.max(sum,nums[i]))

代码如下:

  public int maxSubArray(int[] nums) {
        int max_value = Integer.MIN_VALUE, sum = 0;
        if(nums.length<1){
            return nums.length==0 ? nums[0] : 0; 
        }else{
            for(int i=nums.length-1; i>=0; i--){
                sum += nums[i];
                if(nums[i] > sum){
                    sum = nums[i];
                }
                if(sum > max_value){
                    max_value = sum;
                }
            }
            return max_value;
        }

在leetcode看到一个不用对比nums[i]和sum的,直接在max赋值之后sum如果小于0归0,也很巧妙,如果这个元素之前的总和为0,那么完全可以由他算起,就算全部都是负数,最大的负数也已经存在于max这个赋值中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值