C++ 中循环子数组的最大和
假设我们有一个由 A 表示的整数组成的循环数组 C,我们需要找到 C 中非空子数组的最大可能和。此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。如果数组的形式为 [1,-2,3,-2],则输出为 3。这是因为 subarray[3] 的最大和为 3。
为了解决这个问题,我们将遵循以下步骤 −
n := v 的大小
创建大小均为 n 的数组 leftSum、leftSumMax、rightSum、rightSumMax
leftSum[0] := v[0],leftSumMax[0] := 0 和 v[0] 中的最大值
for i in range 1 to n – 1
leftSum[i] := leftSum[i - 1] + v[i]
leftSumMax[i] := leftSum[i] 和 leftSumMax[i - 1] 中的最大值
rightSum[n - 1] := v[n - 1], leftSumMax[n - 1] := 0 和 v[n - 1] 中的最大值
i 在 n - 2 到 0 的范围内
rightSum[i] := rightSum [i + 1] + v[i]
rightSumMax[i] := rightSum[i + 1] 和 rightSum 中的最大值最大[i]
leftAns := leftSum[0] + rightSumMax[1]
for i in range 1 to n – 2
leftAns := maximum of leftAns, leftSum[i] + rightSumMax[i + 1]
rightAns := rightSum[n - 1] + leftSumMax[n - 2]
for i in range n - 2 down to 1
rightAns := maximum of rightAns, rightSum[i] + leftSumMax[i - 1]
curr := v[0], kadane := v[0]
for i in range 1 to n – 1
curr := max of v[1], curr + v[i]
kadane := max of curr and kadane
return the max of leftAns, rightAns and kadane
让我们看看下面的实现以便更好地理解 −
示例
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxSubarraySumCircular(vector<int>& v) { int n = v.size(); vector <int> leftSum(n),leftSumMax(n),rightSum(n), rightSumMax(n); leftSum[0] = v[0]; leftSumMax[0] = max((int)0,v[0]); for(int i =1;i<n;i++){ leftSum[i] = leftSum[i-1] + v[i]; leftSumMax[i] = max(leftSum[i],leftSumMax[i-1]); } rightSum[n-1] = v[n-1]; rightSumMax[n-1] = max((int)0,v[n-1]); for(int i =n-2;i>=0;i--){ rightSum[i] = rightSum[i+1]+v[i]; rightSumMax[i] = max(rightSumMax[i+1],rightSum[i]); } int leftAns=leftSum[0]+rightSumMax[1]; for(int i =1;i<n-1;i++){ leftAns = max(leftAns,leftSum[i]+rightSumMax[i+1]); } int rightAns = rightSum[n-1]+leftSumMax[n-2]; for(int i =n-2;i>=1;i--){ rightAns = max(rightAns,rightSum[i]+leftSumMax[i-1]); } int curr=v[0]; int kadane = v[0]; for(int i =1;i<n;i++){ curr = max(v[i],curr+v[i]); kadane = max(curr,kadane); } return max(leftAns,max(rightAns,kadane)); } }; main(){ vector<int> v = {1,-2,3,-2}; Solution ob; cout << (ob.maxSubarraySumCircular(v)); }
输入
[1,-2,3,-2]
输出
3