思路:
处理循环问题,我们把方向换一下,比如 1,-3,2,4
① 找不循环的最大值 ans1(这个很容易)
② 找循环的最大值,换个角度思考:找不循环的最小值即可,然后ans2=sum-这个值
答案就是max(ans1,ans2)
class Solution {
public:
#define ll long long
ll dp1[30005];
ll dp2[30005];
int maxSubarraySumCircular(vector<int>& nums) {
ll n=nums.size();
ll ans1=-900000005,ans2=900000000;
ll sum=0;
dp1[0]=nums[0];
dp2[0]=nums[0];
ans1=max(ans1,dp1[0]);
ans2=min(ans2,dp2[0]);
sum+=nums[0];
int flag=0;
for(int i=1;i<n;i++)
{
dp1[i]=nums[i];
dp1[i]=max(dp1[i],dp1[i-1]+dp1[i]);
dp2[i]=nums[i];
dp2[i]=min(dp2[i],dp2[i-1]+dp2[i]);
ans1=max(ans1,dp1[i]);
ans2=min(ans2,dp2[i]);
sum+=nums[i];
if(nums[i]>0)flag=1;
}
if(flag==0)return ans1;
return max(ans1,sum-ans2);
}
};