给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。
环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。
子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。
来源:力扣(LeetCode)
题目链接:https://leetcode-cn.com/problems/maximum-sum-circular-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法:动态规划
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
int n = nums.size();
vector<int> dp_max(n);
vector<int> dp_min(n);
dp_max[0] = nums[0], dp_min[0] = nums[0];
int sum = nums[0];
int max_sum = nums[0];
int min_sum = nums[0];
for(int i = 1; i < n; ++i){
dp_max[i] = max(dp_max[i - 1] + nums[i], nums[i]);
dp_min[i] = min(dp_min[i - 1] + nums[i], nums[i]);
sum = sum + nums[i];
max_sum = max(max_sum, dp_max[i]);
min_sum = min(min_sum, dp_min[i]);
}
//int max_sum = *max_element(dp_max.begin(), dp_max.end());
//int min_sum = *min_element(dp_min.begin(), dp_min.end());
return (sum - min_sum == 0) ? max_sum : max(max_sum, sum - min_sum);
}
};