C++ 中的最大圆形子数组
假设我们有一个由 A 表示的整数循环数组 C,我们需要找到 C 的非空子数组的最大可能和。此外,子数组只能包含固定缓冲区 A 中的每个元素最多一次。如果数组类似于 [1,-2,3,-2],则输出将为 3。这是因为子数组 [3] 的最大和为 3。
为了解决这个问题,我们将遵循以下步骤:
n := v 的大小
创建大小为 n 的数组 leftSum、leftSumMax、rightSum、rightSumMax
leftSum[0] := v[0],leftSumMax[0] := 0 和 v[0] 中的最大值
对于 i 从 1 到 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 Max[i] 中的最大值
leftAns := leftSum[0] + rightSumMax[1]
对于 i 从 1 到 n – 2
leftAns := leftAns、leftSum[i] + rightSumMax[i + 1] 中的最大值
rightAns := rightSum[n - 1] + leftSumMax[n - 2]
对于 i 从 n - 2 到 1
rightAns := rightAns、rightSum[i] + leftSumMax[i - 1] 中的最大值
curr := v[0],kadane := v[0]
对于 i 从 1 到 n – 1
curr := v[1]、curr + v[i] 中的最大值
kadane := curr 和 kadane 中的最大值
返回 leftAns、rightAns 和 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
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP