leetcode 53 最大子序和
求任何的最大值和最小值问题时,一定要将最开始的值定义成理论上的最大值和最小值
define INT_MAX 0x7fffffff
define INT_MIN 0x80000000
思路一:直接暴力法求解
利用双循环,在第二个循环里,每次计算一个和值,并且与定义的最大值比较,如果比最大值大,则将最大值置为该和值,在第一个循环里,每次将和值置为0。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//暴力法求解,利用双循环,求这一类最大值最小值的问题,一定要定义成理论上的最大值和最小值
//define INT_MAX 0x7fffffff
//define INT_MIN 0x80000000
int maxSum = INT_MIN;
for(int i = 0; i < nums.size(); i++)
{
int sum = 0;
for (int j = i; j < nums.size(); j++)
{
sum += nums[j];
if (sum > maxSum)
{
maxSum = sum;
}
}
}
return maxSum;
}
};
思路二:DP(动态规划)求解
1、建立一个dp表,dp[i] 表示以nums[i]结尾的最大子序和
2、对dp[i],它的值要么是dp[i-1] + nums[i], 要么是nums[i]
3、从建立的dp表中找出最大的子序和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSum = INT_MIN;
vector<int> dp(nums.size()); // 定义一个dp表,dp[i]表示以nums[i]结尾的最大子序和
dp[0] = nums[0];
for (int i = 1; i < nums.size(); i++)
{
dp[i] = ((dp[i-1] + nums[i]) > nums[i]) ? (dp[i-1] + nums[i]) : nums[i]; //dp[i]的结果要么是dp[i-1] + nums[i],要么是nums[i]
}
for (int& val : dp) //从dp表中找出最大的子序和
{
if (val > maxSum)
{
maxSum = val;
}
}
return maxSum;
}
};
思路三:贪心算法求解
从左到右一直相加,当sum < 0时,则重新寻找子序列
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//贪心算法求解,从左向右依次迭加
int maxSum = INT_MIN;
int sum = 0;
for(int& val : nums)
{
sum += val;
maxSum = max(sum, maxSum);
if(sum < 0)
{
sum = 0;
}
}
return maxSum;
}
};
来源:CSDN
作者:嫌疑人_X
链接:https://blog.csdn.net/qq_42016124/article/details/103236203