Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
思路1
- 使用贪心的方法,每一步选择最佳方案,最后得到全局最优
- 在每个步骤中更新
- 当前元素
- 当前元素位置的最大和
- 迄今为止的最大和
时间复杂度 O(N)O(N)O(N) 空间复杂度 O(1)O(1)O(1)

代码1
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max_sum = nums[0], cur_sum = nums[0];
for(int i = 1; i < nums.size(); i++)
{
cur_sum = max(cur_sum + nums[i], nums[i]); // 当前最大和
max_sum = max(max_sum, cur_sum); // 历史最大和
}
return max_sum;
}
};
思路2
首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 max_sum
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字。如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字。每次比较 sum 和 max_sum 的大小,将最大值置为 max_sum,遍历结束返回结果。实际处理过程中可以使用滚动数组来存储值。
时间复杂度 O(N)O(N)O(N) 空间复杂度 O(1)O(1)O(1)

代码2
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size(), max_sum = nums[0];
for(int i = 1; i < len; i++)
{
if(nums[i-1] > 0)
nums[i] += nums[i-1] ;
max_sum = max(max_sum, nums[i]);
}
return max_sum;
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0], sum = 0;
for(const auto &it : nums)
{
if(sum > 0)
sum += it;
else
sum = it;
ans = max(sum, ans);
}
return ans;
}
};
在线处理
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res =-0x7fffffff, temp = 0;
for(int i = 0; i < nums.size(); i++)
{
temp += nums[i];
if(temp > res) res = temp;
if(temp < 0) temp = 0;
}
return res;
}
};
思路3
分治法
代码3
本文深入探讨了寻找最大子数组和的算法实现,包括贪心算法和分治法。通过实例讲解了如何在O(N)的时间复杂度下找到具有最大和的连续子数组,并提供了详细的代码示例。
556

被折叠的 条评论
为什么被折叠?



