leetcode-master/problems/0053.最大子序和.md

2.2 KiB
Raw Blame History

笔者在BAT从事技术研发多年利用工作之余重刷leetcode更多原创技术文章欢迎关注「代码随想录」校招社招求职内推欢迎通过公众号「代码随想录」联系我度厂很缺人

笔者在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;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。