其他分享
首页 > 其他分享> > Leetcode53. 最大子序和(贪心+动态规划)

Leetcode53. 最大子序和(贪心+动态规划)

作者:互联网

题目链接:https://leetcode-cn.com/problems/maximum-subarray/

解题思路

方法一:贪心

如果我们用贪心算法,那么我们可以遍历每一个值,并且把每一个值的和都用s统计,然后先比较s是否比最后的答案要大,如果比最后答案大则更新答案。然后再利用贪心,我们可以知道,如果前面的和小于0那我们肯定不会选择要前面的子序列,而是选择以这个位置开始重新计算子序列,所以如果s < 0,则使s = 0

代码

class Solution {
    public int maxSubArray(int[] nums) {
        int ans = nums[0], s = 0;   
        for(int i : nums) {
            s += i;
            if(s > ans) 
                ans = s;
            if(s < 0) 
                s = 0;
        }
        return ans;
    }
}

复杂度分析

方法二:动态规划

s记录当前子序列的最大和,ans记录最后结果。我们可以发现如果s + ii小,那么我们肯定会选择i而不会选择小的。

代码

class Solution {
    public int maxSubArray(int[] nums) {
        int s = 0, ans = nums[0];
        for (int i : nums) {
            s = Math.max(s + i, i);
            ans = Math.max(ans, s);
        }
        return ans;
    }
}

复杂度分析

标签:Leetcode53,int,复杂度,nums,ans,序列,子序,贪心
来源: https://blog.csdn.net/qq_44713772/article/details/116446425