Skip to content

Latest commit

 

History

History
57 lines (48 loc) · 2.22 KB

0053.最大子序和.md

File metadata and controls

57 lines (48 loc) · 2.22 KB

笔者在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」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。