मान लीजिए कि हमारे पास एक सरणी है जिसे धनात्मक पूर्णांकों की संख्या कहा जाता है, हमें अधिकतम योग के साथ तीन गैर-अतिव्यापी उपसरणियाँ ढूंढनी होंगी। यहां प्रत्येक सबअरे आकार k का होगा, और हम सभी 3*k प्रविष्टियों के योग को अधिकतम करना चाहते हैं।
हमें प्रत्येक अंतराल की प्रारंभिक स्थिति का प्रतिनिधित्व करने वाले सूचकांकों की सूची के रूप में परिणाम खोजना होगा। यदि एक से अधिक उत्तर हैं, तो हम शब्दावली की दृष्टि से सबसे छोटा उत्तर देंगे।
इसलिए यदि इनपुट [1,2,1,2,6,8,4,1] और k =2 जैसा है, तो परिणाम [0,3,5] होगा, इसलिए उप-सरणी [1,2] हैं, [2,6], [8,4] शुरुआती सूचकांकों [0,3,5] के अनुरूप हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- n :=अंकों का आकार
- आकार 3 की एक सरणी परिभाषित करें इसे inf से भरें
- आकार n + 1 के सरणी योग को परिभाषित करें
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - योग[i + 1] =योग[i] + अंक[i]
- currMax :=newTotal
- posLeft[i] :=i + 1 - k
- posLeft[i] :=posLeft[i - 1]
- newTotal :=sum[i + k] - sum[i]
- यदि newTotal>=currMax, तो −
- currMax :=newTotal
- posRight[i] :=i
- अन्यथा
- posRight[i] :=posRight[i + 1]
- करें
- l :=posLeft[i - 1], r :=posRight[i + k]
- अस्थायी:=(योग [एल + के] - योग [एल]) + (योग [i + के] - योग [i]) + (योग [आर + के] - योग [आर])
- अगर अस्थायी> अनुरोध है, तो −
- ret[0] :=l, ret[1] :=i, ret[2] :=r
- अनुरोध:=अस्थायी
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
int n = nums.size();
vector <int> ret(3, INT_MAX);
vector <int> sum(n + 1);
for(int i = 0; i < n; i++){
sum[i + 1] = sum[i] + nums[i];
}
vector <int> posLeft(n);
vector <int> posRight(n, n - k);
for(int i = k, currMax = sum[k] - sum[0]; i < n; i++){
int newTotal = sum[i + 1] - sum[i + 1- k];
if(newTotal > currMax){
currMax = newTotal;
posLeft[i] = i + 1 - k;
}else{
posLeft[i] = posLeft[i - 1];
}
}
for(int i = n - k - 1, currMax = sum[n] - sum[n - k]; i >=0 ; i--){
int newTotal = sum[i + k] - sum[i];
if(newTotal >= currMax){
currMax = newTotal;
posRight[i] = i;
}else{
posRight[i] = posRight[i + 1];
}
}
int req = 0;
for(int i = k; i <= n - 2 * k; i++){
int l = posLeft[i - 1];
int r = posRight[i + k];
int temp = (sum[l + k] - sum[l]) + (sum[i + k] - sum[i]) + (sum[r + k] - sum[r]);
if(temp > req){
ret[0] = l;
ret[1] = i;
ret[2] = r;
req = temp;
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {1,2,1,2,6,8,4,1};
print_vector(ob.maxSumOfThreeSubarrays(v, 2));
} इनपुट
{1,2,1,2,6,8,4,1}
2 आउटपुट
[0, 3, 5, ]