数组/动态规划 - 42.连续子数组的最大和

在这里插入图片描述

思路1 :数学思路,以途中的案例为例子,第一个数是-2,当前最大的子序和就是-2,如果下一个数是正数,任意的一个正数与负数相加,绝对不可能比自己大了。所以如果当前子序和为负数时,那么就可以抛弃当前的子序。以下一个数字为子序的起始
每一次进行相加之后,都要判断并保存子序和的最大值,例如我们默认第一次的子序和最大值就为数组的第一个数,后面再遍历加和的过程中,如果出现和sum,比上一个最大值大,那么就替换它。
根据这两个思路,我们不难写出代码了。

    public int maxSubArray(int[] nums) {
        if(nums.length == 0 || nums == null ) return -1;
        int sum = nums[0];
        int res = nums[0];
        for(int i = 1 ; i < nums.length; i++){
            if(sum < 0) sum = 0;
            sum += nums[i];
            if(sum > res) res = sum;
                
        }
        return res;
    }

2.动态规划。
每一位下标的子序和
max【i】 = 上一个下标的子序和 + 当前下标的值。(当上一个子序和为正数时)
max【i】 = arr【i】(当上一个子序和为0或者负数时)
所以我们可以做这样的转变,如果上一个子序和加上自己比自己小,那么就把自己作为子序和的第一个值保存。
如果当前的子序和比上一个保存的子序和的结果大,那么保存当前的子序和。

   public int maxSubArray(int[] nums) {
        int sum = 0;
       int res = Integer.MIN_VALUE;
       for(int i = 0 ; i < nums.length;i++){
           sum  = Math.max(sum + nums[i] , nums[i]);
           res =  Math.max(sum,res);
       }
       return res;
    }
原创文章 139 获赞 23 访问量 5919

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104528508