https://blog.csdn.net/amf12345/article/details/100066857?ops_request_misc=%7B%22request%5Fid%22%3A%22158304627519195239826637%22%2C%22scm%22%3A%2220140713.130056874…%22%7D&request_id=158304627519195239826637&biz_id=0&utm_source=distribute.pc_search_result.none-task
//介绍了分治、贪心和动态规划
暴力方法:
class Solution
{public: int maxSubArray(vector<int> &nums){
if(nums.size()==0)
return 0;//考虑特殊情况:数组中不含有任何元素
int max = nums[0];
for (int i = 0; i < nums.size(); i++){
int sum = 0;
for (int j = i; j < nums.size(); j++){
sum += nums[j];
if (sum > max){
max = sum;
}
}
}
return max;
}
};
动态规划法:
思路:已知一个数组A和下一个元素B,和他们的数组A中的元素和B的和为C我们求最大子序和要将C与B进行比较,C>B的时候选择C,B>C的时候选择B,如果在给一个元素D,我们作和分别是:B+D和C+D,要构成最大子序和所以我们要选择B和C中更大的数继续进行加法.
代码中我们还要使用一个三目运算符来表达取B和C中较大的值
class Solution {public: int maxSubArray(vector<int>& nums) {
if(nums.size() == 0)
return 0;//判断数组是否为空
vector<int>dp(nums.size(),0);//定义一个数组,长度为nums.size()
dp[0] = nums[0];//初始化dp[0]
int max = nums[0];//初始化当前最大子序和
for(int i = 1;i<nums.size();i++)//i要从1开始因为dp[i-1]中要有元素
{
dp[i]=nums[i]>nums[i]+dp[i-1]?nums[i]:nums[i]+dp[i-1];
//三目运算符即比较思路中B和C的大小,从而往下继续进行加法
if(max<dp[i])
max = dp[i];
}
return max;
}
};
更简单实现的动态规划
Cpp实现
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxF = nums[0],ans = nums[0];
for(int i = 1;i < nums.size();i++){
int mx = maxF;
maxF = max(mx + nums[i],nums[i]);
ans = max(maxF,ans);
}
return ans;
}
};
贪心法:
class Solution
{public: int maxSubArray(vector<int>& nums) {
if(nums.size()==0)
return 0;
int sum = 0;
int result = nums[0];
for(int i = 0;i<nums.size();i++){
sum += nums[i];
result = max(result,sum);
//如果sum<0,重新开始找子序组
if(sum<0)
sum = 0;
}
return result; }
};