题目来源:leetcode第918题。环形最大子数组和
给定一个由整数数组 \(A\) 表示的环形数组 \(C\),求 \(C\) 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当 \(0 <= i < A.length\) 时 \(C[i] = A[i]\),且当 \(i >= 0\) 时 \(C[i+A.length] = C[i]\)。此外,子数组最多只能包含固定缓冲区 \(A\) 中的每个元素一次。(形式上,对于子数组 \(C[i], C[i+1], ..., C[j]\) ,不存在 \(i <= k1, k2 <= j\) 其中 \(k1 % A.length = k2 % A.length\) )
该方法来自这里,他的方法通俗易懂。
简单来说,要求该环行数组的最大和,分成两种情况:
该解法涉及到一种情况是:
class Solution{ public: int maxSubarraySumCircular(vector<int>& nums) { int ans; int n = nums.size(); int sum = 0; int dmin = 30000 + 1; int dmax = -30000 - 1; vector<int> dpmax(n + 1,0); vector<int> dpmin(n + 1,0); for(int i = 1;i <= n;i++){ dpmax[i] = max(dpmax[i - 1] + nums[i - 1],nums[i - 1]); dpmin[i] = min(dpmin[i - 1] + nums[i - 1],nums[i - 1]); dmax = dmax>dpmax[i]?dmax:dpmax[i]; dmin = dmin<dpmin[i]?dmin:dpmin[i]; sum += nums[i - 1]; } if(dmax >= 0) ans = max(dmax , sum - dmin); else ans = dmax; return ans; } };