力扣53. 最大子数组和
题目来源(力扣):
https://leetcode.cn/problems/maximum-subarray/description/
题目描述:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
基本思路:
贪心入门级题目,从数组的开头累计和值sum,如果任意时刻sum<0则将sum修改为0,表示舍弃已累计的数值,重新选数。
过程中最大的sum就是答案ans
具体可见代码
代码实现:
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int sum = 0;
int ans = nums[0];
for (auto num : nums)
{
sum += num;
if (sum > ans)
ans = sum;
if (sum < 0)
sum = 0;
}
return ans;
}
};
时间复杂度
O(n)
补充
为什么要累积sum?为什么sum小于0时要重新置0?
因为一段连续的数有可能对最终的数组做出贡献。对于选出的数,即使其中有正数(产生正面影响)有负数(产生负面影响),只要他们的累计和不小于0则就会对最终的结果产生正面影响。否则,说明已经选出的数整体上会产生负面影响,因此不如直接全部舍弃,重新累计sum。
如果所有的数都为负数怎么办?
直观上来讲就是选出最大的负数,而在代码中不需要额外处理。因为我们先将sum与ans进行比较,对ans更新后再对sum置0,因此会自动完成选出最大负数的操作。
浙公网安备 33010602011771号