思路
最大子数组的满足的条件
- [x x x x (正x x x x x x x x x 正)x x x x ],两边一定是正数,如果至少有一个负数,会是的整个子数组和变小。
- [x x x x 负(正x x x x x x x x x 正)负 x x x x ],子数组两个边界外的数字一定是负数,如果是整数,一定会被扩充到子数组中,使得子数组和变的更大,是0不影响
- 环形数组一定包括两个边界,所以它的形式是[x x x x 正(负x x x x x x x x x 负)正 x x x x ],其中(负x x x x x x x x x 负)是最小子数组和,解释同上。那么此时,环形子数组的最大和 = 数组和 - 子数组的最小和
- 综上,最大和环形和环形数组各自最大子数组之和中最大的那个
代码
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
int maxSum = INT_MIN;
int minSum = INT_MAX;
int sum = 0;
int lastMin = 0;
int lastMax = 0;
for (auto x : nums) {
int curMax = max(lastMax, 0) + x;
int curMin = min(lastMin, 0) + x;
maxSum = max(curMax, maxSum);
minSum = min(curMin, minSum);
lastMin = curMin;
lastMax = curMax;
sum += x;
}
return maxSum > 0 ? max(maxSum, sum - minSum) : maxSum;
}
};