918. Maximum Sum Circular Subarray
给你一个array,请找出最大的subarray,并回传总和
该array是一个circular array,也就是第一个元素与最后一个元素相连
subarray中每个元素只能出现一次
思路:
有两种情况
1.最大的subarray是出现在0~n-1之间
2.最大的subarray是出现在i~n-1~0~i-1之间
第一种情况直接找max subarray就可以
第二种情况max subarray在i~n-1~0~i-1之间代表min subarray在0~n-1之间,所以求出array总和
和min subarray,两个相减就是max subarray的值
所以就从0~n-1分别找出max subarray、min subarray、sum
回传max sbuarray和sum-min subarray间比较大的值
还有一个特例就是所有元素都是负数,此时max subarray的值会是负数
golang code :
func maxSubarraySumCircular(nums []int) int {
curmax:=nums[0]
curmin:=nums[0]
maxsum:=nums[0]
minsum:=nums[0]
sum:=nums[0]
for _,val:=range nums[1:]{
curmax=max(val,curmax+val)
curmin=min(val,curmin+val)
maxsum=max(maxsum,curmax)
minsum=min(minsum,curmin)
sum+=val
}
if maxsum<0{
return maxsum
}
return max(maxsum,sum-minsum)
}