一、题意
给出一个环形整数数组 nums(整数数组) ,求连续相加的最大值(相邻下标加在一起),包括单个元素的情况。
二、解法
解法:
Kadane 算法:
d
p
=
m
a
x
(
A
[
j
]
+
d
p
,
0
)
dp=max(A[j]+dp,0)
dp=max(A[j]+dp,0)
两种情况:
1、最大值没有跨尾部到首部,跟非环形做法一样。
2、最大值跨尾部,即最大值是两边相加,而中间可能是最小值,求出数组中最小值。将所有元素相加减去最小值。
3、比较1、2大小即为最大值。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、代码
1、解法
int maxSubarraySumCircular(vector<int>& nums) {
int n = nums.size();
int sum = 0,dp=0,maxN=INT_MIN;
for(int i=0; i<n; i++){
sum+=nums[i];
dp=nums[i]+max(dp,0);
maxN = max(dp,maxN);
}
int minN=0;
dp = 0;
for(int i=0; i<n-1; i++){
dp=nums[i]+min(dp,0);
minN = min(dp,minN);
}
return max(sum-minN,maxN);
}