题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
方法一:暴力求解
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int max = INT_MIN;
int numsSize = int(nums.size());
for (int i = 0; i < numsSize; i++)
{
int sum = 0;
for (int j = i; j < numsSize; j++)//每次从当前起点开始算和相当于将以所有下标为起点和都算出求其最大值
{
sum += nums[j];
if (sum > max)
{
max = sum;
}
}
}
return max;
}
};
方法二:DP
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数组
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
result = max(result, dp[i]);
}
return result;
}
};//可以将DP数组优
方法三:贪心
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
int result = INT_MIN;
int numsSize = int(nums.size());
int sum = 0;
for (int i = 0; i < numsSize; i++)
{
sum += nums[i];
result = max(result, sum);
//如果sum < 0,重新开始找子序串,sum<0表示当前字序和为负数这样加下一位字序和的值只能减少因此需要重新计算字序和
if (sum < 0)
{
sum = 0;
}
}
return result;
}
};