力扣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,因此会自动完成选出最大负数的操作。

posted @ 2024-11-08 15:49  HB_Computer  阅读(19)  评论(0)    收藏  举报