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;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
方法二:动态规划
s
记录当前子序列的最大和,ans
记录最后结果。我们可以发现如果s + i
比i
小,那么我们肯定会选择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;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
标签:Leetcode53,int,复杂度,nums,ans,序列,子序,贪心 来源: https://blog.csdn.net/qq_44713772/article/details/116446425