static int x=[](){
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}();
// O(n)动态规划方法
// 1. arr[n-1]单独构成最大子数组
// 2. 最大子数组以arr[n-1]结尾
// 3. 最大子数组跟arr[n-1]没关系,最大子数组在arr[0-n-2]范围内,转为考虑元素arr[n-2]
// 从上面我们可以看出,问题分解成了三个子问题,最大子数组就是这三个子问题的最大值,现在我们假设:
// 1. 以arr[n-1]为结尾的最大子数组和为End[n-1]
// 2. 在[0-n-1]范围内的最大子数组和为All[n-1]
// All[i] = max{arr[i],End[i-1]+arr[i],All[i-1] }
// 我们这里可以用end和ans代替End[i - 1] 和 ALL[i - 1],优化空间复杂度
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 1)
return nums[0];
int ans = nums[0], end = nums[0];
for (int i = 1; i < nums.size(); i++){
end = max(end + nums[i], nums[i]);
ans = max(end, ans);
}
return ans;
}
};
// // O(n)算法,S[i,j] = S[j] - S[i-1],求S[i-1]最小值
// class Solution {
// public:
// int maxSubArray(vector<int>& nums) {
// if (nums.size() == 1)
// return nums[0];
// for (int i = 1; i < nums.size(); i++)
// nums[i] += nums[i - 1];
// int min = nums[0];
// int ans = nums[0];
// for (int i = 1; i < nums.size(); i++){
// if (nums[i - 1] < min)
// min = nums[i - 1];
// if (nums[i] - min > ans)
// ans = nums[i] - min;
// }
// return ans;
// }
// };
LetCode 53. 最大子序和
最新推荐文章于 2019-03-24 23:01:35 发布