连续子数组的最大和(*)
将数组第一位存入curSum与maxSum,从下一位开始遍历,判断之前的curSum值不值当加
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
if (array.size() == 0) return 0;
int curSum = array[0], maxSum = array[0];
for (int i = 1; i < array.size(); i++) {//注!!需要从第一项开始
//第一步 判断之前的curSum小于0就从本项开始,大于0就加上本项
if (curSum < 0) {//注!!判断之前和是不是小于0,值不值当加
curSum = array[i];
}
else {
curSum = curSum + array[i];
}
//第二步 判断maxSum需不需要更新
if (maxSum < curSum) {
maxSum = curSum;
}
}
return maxSum;
}
};
也可以用动态规划的方法做,考虑最大字段的最大和,字段的和只可能是以第一个数字结尾,第二个数字结尾。。。第n个数字结尾。所以可以的到状态公式:dp[i] = max(dp[i] + nums[i], nums[i]);
因为是求所有子数组的最大和,所以要不断对比以每个数字结尾的最大子段和中的最大的子段和。
//动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.empty()) return 0;
int resmax = nums[0];
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
for (int i = 1; i < dp.size(); i++) {
dp[i] = max(nums[i], dp[i - 1] + nums[i]);//遍历到每个子数组就是必须加上这个数字的最大子段和
resmax = max(resmax, dp[i]);
}
return resmax;
}
};