918. Maximum Sum Circular Subarray
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
.
Example 1:
Input: nums = [1,-2,3,-2] Output: 3 Explanation: Subarray [3] has maximum sum 3.
Example 2:
Input: nums = [5,-3,5] Output: 10 Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10.
Example 3:
Input: nums = [-3,-2,-3] Output: -2 Explanation: Subarray [-2] has maximum sum -2.
Constraints:
n == nums.length
1 <= n <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public: | |
int maxSubarraySumCircular(vector<int>& nums) { | |
int n = nums.size(); | |
// find min & max sub array | |
int min_sum = nums[0]; | |
int min_pre = nums[0]; | |
int max_sum = nums[0]; | |
int max_pre = nums[0]; | |
for(int i = 1; i < n; i++){ | |
// min | |
int min_cur = min(min_pre + nums[i], nums[i]); | |
min_pre = min_cur; | |
min_sum = min(min_sum, min_cur); | |
// max | |
int max_cur = max(max_pre + nums[i], nums[i]); | |
max_pre = max_cur; | |
max_sum = max(max_sum, max_cur); | |
} | |
// sum | |
int sum = 0; | |
for(auto x: nums) | |
sum += x; | |
return sum == min_sum ? max_sum : max(max_sum, sum - min_sum); | |
} | |
}; |
No comments:
Post a Comment