给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
贪心解法
思路如下:
- 使用sum记录到达当前索引的时候最大的连续子数组的和
- sum初始化为nums[0]
- 遍历数组,到达索引i的时候,sum表示前面i个最大的连续子数组的和
- 如果sum > 0 ,则表示可以将当前元素和之前的sum累加,即 sum = sum + nums[i]
- 否则,sum = nums[i]
代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0)
{
return 0;
}
int sum = nums[0];
int ans = sum;
for (int i = 1;i < nums.size();++i)
{
int tmp = sum + nums[i];
if (sum > 0)
{
sum = tmp;
}
else
{
sum = nums[i];
}
ans = std::max(ans,sum);
}
return ans;
}
};
动态规划解法
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int result = INT_MIN;
int numsSize = int(nums.size());
//dp[i]表示nums中以nums[i]结尾的最大子序和
vector<int> dp(numsSize);
dp[0] = nums[0];
result = dp[0];
for (int i = 1; i < numsSize; i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
result = max(result, dp[i]);
}
return result;
}
};