vector<int> continuousSubarraySumII(vector<int>& A) { int ans1; vector<int> vec1 = continuousSubarraySum(A, ans1); // 如果ans1 < 0 的话,说明全是复数, // 直接返回vec1就可以了,不需要再继续了。 if(ans1 < 0) return vec1; int n = A.size(); if(n <= 2) return vec1; int ans2; // 计算最小连续子数组 vector<int> vec2 = continuousSubarraySum1(A, ans2); int sum = accumulate(A.begin(), A.end(), 0); // 总和减去连续最小子数组,就是连续旋转子数组的最大和 ans2 = sum - ans2; // 这里的>= 不能少了等于号,等于的情况下,也要返回不旋转的才对 if(ans1 >= ans2) return vec1; --vec2[0]; ++vec2[1]; swap(vec2[0], vec2[1]); return vec2; }
/** * @param A an integer array * @return A list of integers includes the index of * the first number and the index of the last number */ vector<int> continuousSubarraySumII(vector<int>& A) { int msum1; vector<int> ans1; ans1 = continuousSubarraySum(A, msum1); if (ans1[0] == ans1[1]) { return ans1; } vector<int> s1; vector<int> i1; vector<int> s2; vector<int> i2; int n = A.size(); int i; int sum; s1.resize(n); i1.resize(n); s2.resize(n); i2.resize(n); sum = A[0]; s1[0] = A[0]; i1[0] = 0; for (i = 1; i <= n - 1; ++i) { sum += A[i]; if (sum > s1[i - 1]) { s1[i] = sum; i1[i] = i; } else { s1[i] = s1[i - 1]; i1[i] = i1[i - 1]; } } sum = A[n - 1]; s2[n - 1] = A[n - 1]; i2[n - 1] = n - 1; for (i = n - 2; i >= 0; --i) { sum += A[i]; if (sum > s2[i + 1]) { s2[i] = sum; i2[i] = i; } else { s2[i] = s2[i + 1]; i2[i] = i2[i + 1]; } } int msum2 = 0; vector<int> ans2; ans2.resize(2); for (i = 0; i < n - 1; ++i) { if (s1[i] + s2[i + 1] > msum2) { msum2 = s1[i] + s2[i + 1]; ans2[0] = i2[i + 1]; ans2[1] = i1[i]; } } return msum1 > msum2 ? ans1 : ans2; }