मान लीजिए कि हमारे पास ए द्वारा दर्शाए गए पूर्णांकों की एक गोलाकार सरणी सी है, हमें सी के एक गैर-रिक्त उपसरणी का अधिकतम संभव योग खोजना होगा। साथ ही, एक सबरे में केवल एक बार में निश्चित बफर ए के प्रत्येक तत्व को शामिल किया जा सकता है। यदि सरणी [1,-2,3,-2] की तरह है, तो आउटपुट 3 होगा। ऐसा इसलिए है क्योंकि सबरे [3] में अधिकतम योग 3 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n:=वी का आकार
-
सरणियाँ बनाएँ लेफ्टसम, लेफ्टसममैक्स, राइटसम, राइटसममैक्स सभी आकार n
-
लेफ्टसम [0]:=वी [0], लेफ्टसममैक्स [0]:=अधिकतम 0 और वी [0] पी>
-
मैं के लिए 1 से n - 1 की सीमा में
-
लेफ्टसम [i] :=लेफ्टसम [i - 1] + v[i]
-
लेफ्टसममैक्स [i]:=अधिकतम लेफ्टसम [i] और लेफ्टसममैक्स [i - 1]
-
-
राइटसम [एन -1]:=वी [एन -1], लेफ्टसममैक्स [एन -1]:=अधिकतम 0 और वी [एन -1]
-
मेरे लिए n - 2 से 0 तक की श्रेणी में है
-
राइटसम [i]:=राइटसम [i + 1] + v[i]
-
राइटसममैक्स [i]:=अधिकतम राइटसम [i + 1] और राइटसम मैक्स [i]
-
-
लेफ्टएन्स:=लेफ्टसम [0] + राइटसममैक्स [1]
-
मैं के लिए 1 से n - 2 की सीमा में
-
बायांएं:=अधिकतम बाएं उत्तर, बाएं योग [i] + दायां सममैक्स [i + 1]
-
-
दायां उत्तर:=दायां योग [एन -1] + बाएं सममैक्स [एन - 2] पी>
-
मेरे लिए n - 2 से लेकर 1 तक की श्रेणी में है
-
दायां उत्तर:=अधिकतम दायां उत्तर, दायां योग [i] + बायां सममैक्स [i - 1]
-
-
curr:=v[0], kadane:=v[0]
-
मैं के लिए 1 से n - 1 की सीमा में
-
curr :=अधिकतम v[1], curr + v[i]
-
कडाने :=करी और कडाने की अधिकतम
-
-
बाएँ उत्तर, दाएँ उत्तर और कडाने का अधिकतम लौटाएँ
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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