मान लीजिए कि हमारे पास n तत्वों और एक मान k के साथ एक सरणी है। हमें k आकार के प्रत्येक सन्निहित उप-सरणी के लिए अधिकतम मान ज्ञात करना होगा।
इसलिए, यदि इनपुट arr =[3,4,6,2,8], k =3 जैसा है, तो आउटपुट आकार 3 के सन्निहित उप-सरणी होंगे [3,4,6], [4,6, 2], [6,2,8], इसलिए अधिकतम तत्व 6, 6 और 8 हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- क आकार k का एक deque Qi परिभाषित करें
- इनिशियलाइज़ i :=0 के लिए, जब i
- जबकि क्यूई खाली नहीं है और गिरफ्तारी[i]>=arr[क्यूई का अंतिम तत्व], करें:
- क्यूई से अंतिम तत्व हटाएं
- क्यूई के अंत में i डालें
- जबकि क्यूई खाली नहीं है और गिरफ्तारी[i]>=arr[क्यूई का अंतिम तत्व], करें:
- प्रदर्शन गिरफ्तारी [क्यूई का पहला तत्व]
- जबकि क्यूई खाली नहीं है और क्यूई का पहला तत्व <=i - k, करें:
- क्यूई से फ्रंट एलिमेंट हटाएं
- जबकि क्यूई खाली नहीं है और गिरफ्तारी[i]>=arr[क्यूई का अंतिम तत्व], करें:
- क्यूई से अंतिम तत्व हटाएं
- क्यूई के अंत में i डालें
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int main(){
vector<int> arr = {3,4,6,2,8};
int k = 3;
deque<int> Qi(k);
int i;
for (i = 0; i < k; ++i){
while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])
Qi.pop_back();
Qi.push_back(i);
}
for ( ; i < arr.size(); ++i){
cout << arr[Qi.front()] << " ";
while ( (!Qi.empty()) && Qi.front() <= i - k)
Qi.pop_front();
while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])
Qi.pop_back();
Qi.push_back(i);
}
cout << arr[Qi.front()] << endl;
}
इनपुट
{3,4,6,2,8}, 3 आउटपुट
6 6 8