✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
题目描述
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为 O(n)。
数据范围
数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。样例
输入:[1, -2, 3, 10, -4, 7, 2, -5] 输出:18
方法一:贪心 O(n)
这道题可以这么想:
- 由于数组中存在负数,所以
ans
要初始化为负无穷,然后用cnt
来保存当前遍历的累加和。 - 判断
cnt
是否小于0
,如果小于0
就将它置为0
。 cnt
加上当前遍历到的数,然后与ans
进行比较,如果出现更大的值就更新。
我们拿题目的样例举例,来看看具体是如何实现的:
第一步: 先初始化 cnt = 0
,且 ans = INT_MIN
。
第二步: 将 1
加入 cnt
,发现 cnt
比 ans
大,更新答案 ans
。
第三步: 将 -2
加入 cnt
,发现 cnt
小于 0
,故将 cnt
置 0
。
第四步 ~ 第九步: 重复上述操作,不断更新答案。
第十步: 返回最终答案 ans
。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int cnt = 0, ans = INT_MIN;
for (auto x : nums)
{
if (cnt < 0) cnt = 0;
cnt += x;
ans = max(ans, cnt);
}
return ans;
}
};
欢迎大家在评论区交流~