笔者在BAT从事技术研发多年,利用工作之余重刷leetcode,希望结合自己多年的实践经验,把算法讲的更清楚,更多原创文章欢迎关注公众号「代码随想录」。
题目地址
https://leetcode-cn.com/problems/maximum-subarray/
暴力解法
暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值
时间复杂度:O(n^2)
空间复杂度:O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) { // 设置起始位置
count = 0;
for (int j = i; j < nums.size(); j++) { // 每次从起始位置i开始遍历寻找最大值
count += nums[j];
result = count > result ? count : result;
}
}
return result;
}
};
贪心解法
贪心解法,其实不是很好理解, 看上面暴力的解法是两层for循环,那如何省掉一层for循环呢
其实暴力解法中设置起始位置这个for循环是可以省略掉的,这也是关键的一步,有了这个思路之后,就可以看一下代码了
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > result) { // 相当于每次取各个终点的最大值
result = count;
}
if (count <= 0) count = 0; // 相当于重置起点,因为遇到负数一定是拉低总体数值的
}
return result;
}
};
更多精彩文章持续更新,可以微信搜索「 代码随想录」第一时间阅读,关注后有大量的学习资料和简历模板可以免费领取,本文 GitHub:https://github.com/youngyangyang04/leetcode-master 已经收录,欢迎star,fork,共同学习,一起进步。