918. 环形子数组的最大和
class Solution {
public:
int maxSubarraySumCircular(vector<int>& nums) {
int numsLength = nums.size();
// dp[i]用来记录以nums[i]结尾的最大子序列和
vector<int> dp(numsLength, 0);
dp[0] = nums[0];
int sum = nums[0];
// 第一种情况:取得最大值时不需要首尾相连,退化成无环最大子数组和问题
int max_acyclic = dp[0];
for(int i = 1; i < numsLength; i++){
sum += nums[i];
if(dp[i - 1] > 0){
dp[i] = dp[i - 1] + nums[i];
}
else{
dp[i] = nums[i];
}
max_acyclic = max(max_acyclic, dp[i]);
}
// 第二种情况:取得最大值时需要首尾相连,此时最大值 为 数组总和-首尾开区间之间的最小子数组和
int min_acyclic = 0;
for(int i = 1; i < numsLength - 1; i++){
if(dp[i - 1] < 0){
dp[i] = dp[i - 1] + nums[i];
}
else{
dp[i] = nums[i];
}
min_acyclic = min(min_acyclic, dp[i]);
}
// 最大的环形子数组和 = max(最大子数组和,数组总和-最小子数组和)
return max(max_acyclic, sum - min_acyclic);
}
};
参考评论区