最大子数组和

Solution
#include<iostream>
#include<vector>
using namespace std;
const int minf = -1e9;//普通dp做法
int maxSubArray1(vector<int>& nums) {int n = nums.size();vector<int>dp(n, minf);dp[0] = nums[0];int ans = dp[0];for (int i = 1; i < n; ++i) {dp[i] = max(dp[i - 1] + nums[i], nums[i]);ans = max(ans, dp[i]);}return ans;
}//dp+空间压缩
int maxSubArray2(vector<int>& nums) {int n = nums.size();//vector<int>dp(n, minf);int last = nums[0];int ans = last;for (int i = 1; i < n; ++i) {last = max(last + nums[i], nums[i]);ans = max(ans, last);}return ans;
}//记录区间下标
int Sum = minf, Left = 0, Right = 0;
int maxSubArray3(vector<int>& nums) {int n = nums.size();int l = 0, r = 0;int pre = nums[0];for (int r = 1; r < n; ++r) {int cur = nums[r];if (pre > 0) {cur += pre;}else {l = r;}if (cur > Sum) {Sum = cur;Left = l;Right = r;}pre = cur;}return Sum;
}
int main() {vector<int>nums = { 1,2,-3,0,2,5,6 };int ans = maxSubArray3(nums);cout << ans << " " << Left << " " << Right;return 0;
}