53. 最大子数组和

贪心

class Solution {
    public int maxSubArray(int[] nums) {

        /**
         * 元素中有负数,因此max初始值取负数最小值
         */
        int max = -Integer.MAX_VALUE;
        int sum = 0;

        for (int i = 0; i < nums.length; i++) {

            sum += nums[i];

            /**
             * 每次得到一个新的和,都要更新一下最大值
             */
            if (sum > max){
                max = sum;
            }

            /**
             * 贪心思路
             * 如果加上nums[i]导致结果变负了或者为0,说明这段区间不会带来正收益了
             * 直接清空累加,从下一个元素开始
             */
            if (sum <= 0){
                sum = 0;
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

动态规划

class Solution {
    public int maxSubArray(int[] nums) {

        /**
         * dp[i]定义为以nums[i]结尾的子序列的最大和
         * 因为最大和不一定出现在最后一个元素,因此每次循环都要记录最大值
         */
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = nums[0];

        for (int i = 1; i < nums.length; i++) {

            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            max = Math.max(max, dp[i]);
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/maximum-subarray/

posted @ 2022-02-25 09:55  振袖秋枫问红叶  阅读(21)  评论(0)    收藏  举报