题目描述:
题解:
思路:如果数组被分为三段ABC,如果子数组和最大的在C+A段,那么子数组和最小的部分在B段。
1.先按照非环形数组采用动态规划的方法,求出数组中子数组的最大和res。
2.同样采用动态规划的方法,求出子数组最小和res_min
3.环形数组的子数组最大和为res和sum(nums)-res_min中的最大值。
注意:如果输入数组全为负数,则返回数组中最大值。
class Solution(object): def maxSubarraySumCircular(self, nums): res = 0 cur = 0 for num in nums: cur = max(cur + num, num) res = max(cur, res) if res == 0: return max(nums) cur_min = 0 res_min = 0 for num in nums: cur_min = min(cur_min + num, num) res_min = min(res_min, cur_min) return max(res, sum(nums) - res_min)