> 笔者在BAT从事技术研发多年,利用工作之余重刷leetcode,更多原创技术文章欢迎关注「代码随想录」,校招社招求职内推欢迎通过公众号「代码随想录」联系我,度厂很缺人! > 笔者在BAT从事技术研发多年,利用工作之余重刷leetcode,希望结合自己多年的实践经验,把算法讲的更清楚,更多原创文章欢迎关注公众号「代码随想录」。 ## 题目地址 https://leetcode-cn.com/problems/maximum-subarray/ ## 暴力解法 暴力解法的思路,第一层for 就是设置起始位置,第二层for循环遍历数组寻找最大值 时间复杂度:O(n^2) 空间复杂度:O(1) ``` class Solution { public: int maxSubArray(vector& 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& 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」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。