跳到主要内容

环形子数组的最大和

答案会有以下两种情况

  • 不跨越两端则直接求最大子数组和
  • 跨越两端意味着剩余的部分是不跨越两端的,用整个数组的和减去剩余部分即可得到我们需要求的部分,因而我们需要求原数组的最小子数组和。

答案取这两种情况中的较大值

需要特判一下全为负数的情况,因为此时原数组的最小子数组和就是其自身

class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
int n = nums.size(), ans = INT32_MIN, pre = 0, sum = 0;
for (int i = 0; i < n; ++i) {
pre = max(nums[i], pre + nums[i]);
ans = max(ans, pre);
sum += nums[i];
}
if (*max_element(nums.begin(), nums.end()) >= 0) {
pre = 0;
for (int i = 0; i < n; ++i) {
pre = min(nums[i], pre + nums[i]);
ans = max(ans, sum - pre);
}
}
return ans;
}
};