//动态规划解法
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int len = nums.size();
if (len == 1)
return nums[0];
vector<int> dp(len);//以nums[i] 结尾的最大子序和
dp[0] = nums[0];
int ans = dp[0];
for (int i = 1; i < len; ++i)
{
dp[i] = max(nums[i], dp[i - 1] + nums[i]);
ans = max(ans, dp[i]);
}
return ans;
}
};
//空间优化 优雅写法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto &x: nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
当然也可以贪心暴力
//暴力
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;
}
};
//贪心
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;
}
};