Given a circular integer array nums of length n, return the maximum possible sum of a non-empty subarray of nums.
A circular array means the end of the array connects to the beginning of the array. Formally, the next element of nums[i] is nums[(i + 1) % n] and the previous element of nums[i] is nums[(i - 1 + n) % n].
A subarray may only include each element of the fixed buffer nums at most once. Formally, for a subarray nums[i], nums[i + 1], …, nums[j], there does not exist i <= k1, k2 <= j with k1 % n == k2 % n.
Input: nums = [1,-2,3,-2]
Output: 3
Explanation: Subarray [3] has maximum sum 3.
Input: nums = [5,-3,5]
Output: 10
Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10.
Input: nums = [-3,-2,-3]
Output: -2
Explanation: Subarray [-2] has maximum sum -2.
From: LeetCode
Link: 918. Maximum Sum Circular Subarray
There are two possible scenarios for the maximum sum subarray in a circular array:
For the first scenario, we can use Kadane’s algorithm directly. But for the second scenario, we need a different approach.
If the maximum sum subarray wraps around, then there’s a continuous subarray at the opposite part of the array that has the minimum sum. Think of it as “taking away” the minimum sum part from the total to get the maximum circular sum.
Given this, we can use a similar approach to Kadane’s algorithm to find both:
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int maxSubarraySumCircular(int* nums, int numsSize) {
if (!nums || numsSize == 0) return 0;
int total = 0, maxSum = -30000, curMax = 0, minSum = 30000, curMin = 0;
for (int i = 0; i < numsSize; i++) {
curMax = max(curMax + nums[i], nums[i]);
maxSum = max(maxSum, curMax);
curMin = min(curMin + nums[i], nums[i]);
minSum = min(minSum, curMin);
total += nums[i];
}
if (maxSum > 0) {
return max(maxSum, total - minSum);
} else {
return maxSum;
}
}