मान लीजिए कि हमने पूर्णांक A की एक सरणी दी है और n सरणी A की लंबाई है। अब मान लें कि Bk सरणी A को घुमाकर प्राप्त की गई एक सरणी है, k स्थिति घड़ी-वार। यहां रोटेशन को −
. के रूप में परिभाषित किया जा सकता है-
एफ (के) =0 * बीके [0] + 1 * बीके [1] + ... + (एन -1) * बीके [एन -1]।पी>
अब F(0), F(1), ..., F(n-1) का अधिकतम मान ज्ञात कीजिए।
तो अगर इनपुट ए =[4,3,2,6] जैसा है, तो -
-
एफ(0) =(0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) =0 + 3 + 4 + 18 =25
-
एफ(1) =(0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) =0 + 4 + 6 + 6 =16
-
F(2) =(0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) =0 + 6 + 8 + 9 =23
-
F(3) =(0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) =0 + 2 + 12 + 12 =26
अधिकतम 26 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
n :=सरणी A का आकार, यदि n 0 है, तो वापस 0
-
ret :=0, आकार n के दो सरणियाँ बनाएँ, ये दाएँ और बाएँ हैं
-
बाएं [0] :=ए[0]
-
मैं के लिए 1 से n - 1 की सीमा में
-
बाएँ [i] :=बाएँ[i] + बाएँ[i – 1]
-
बाएँ [i] :=बाएँ[i] + A[i]
-
-
दाएं [एन -1]:=ए [एन -1]
-
मैं के लिए n - 1 से 0 तक की श्रेणी में हूं
-
दाएँ [i] :=दाएँ[i] + दाएँ[i + 1]
-
दाएँ [i] :=दाएँ[i] + A[i]
-
-
राइटमुल:=0, सीएनटी:=n – 1
-
मेरे लिए n - 1 से नीचे 1 तक की श्रेणी में है
-
राइटमुल:=राइटमुल + ए [i] * सीएनटी
-
1 से कम करें
-
-
n आकार की एक सरणी x बनाएं
-
मैं के लिए 0 से n - 2 की सीमा में
-
x[i] :=rightMul
-
राइटमुल:=राइटमुल - राइट [i + 1]
-
-
लेफ्टमूल:=0, सीएनटी:=1
-
मैं के लिए 0 से नीचे n - 2 की सीमा में
-
लेफ्टमूल:=लेफ्टमूल + ए [i] * सीएनटी
-
cnt को 1 से बढ़ाएँ
-
-
1 से कम करें
-
मेरे लिए n - 1 से नीचे 1 तक की श्रेणी में है
-
x[i] :=x[i] + leftMul
-
लेफ्टमुल:=लेफ्टमूल - ए [i - 1] * सीएनटी
-
अगर मैं – 2>=0, फिर लेफ्टमूल :=लेफ्टमूल + लेफ्ट [i – 2]
-
-
अधिकतम x
. लौटाएं
उदाहरण (C++)
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int maxRotateFunction(vector<int>& A) {
lli n = A.size();
if(n == 0) return 0;
lli ret = 0;
vector <lli>right(n);
vector <lli> left(n);
left[0] = A[0];
for(lli i = 1; i < n; i++){
left[i] += left[i - 1];
left[i] += A[i];
}
right[n - 1] = A[n - 1];
for(lli i = n - 2; i >= 0; i--){
right[i] += right[i + 1];
right[i] += A[i];
}
lli rightMul = 0;
lli cnt = n - 1;
for(lli i = n - 1; i > 0; i--){
rightMul += (A[i] * cnt);
cnt--;
}
vector <lli> x(n);
for(lli i = 0; i < n - 1; i++){
x[i] = rightMul;
rightMul -= right[i + 1];
}
lli leftMul = 0;
cnt = 1;
for(lli i = 0; i < n - 1; i++){
leftMul += A[i] * cnt;
cnt++;
}
cnt--;
for(lli i = n - 1; i >= 1; i--){
x[i] += leftMul;
leftMul -= (A[i - 1] * cnt);
if(i - 2 >= 0) leftMul += left[i - 2];
}
ret = INT_MIN;
for(lli i = 0; i < x.size(); i++) ret = max(ret, x[i]);
return ret;
}
};
main(){
Solution ob;
vector<int> v = {4,3,2,6};
cout <<(ob.maxRotateFunction(v));
} इनपुट
[4,3,2,6]
आउटपुट
26