Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में सरणी में अगले बड़े के अगले छोटे को ढूंढना


इस समस्या में, हमें n पूर्णांक मानों वाली एक सरणी arr[] दी जाती है। हमारा कार्य सरणी में अगले बड़े के अगले छोटे को ढूंढना है।

समस्या विवरण – हम सरणी में वर्तमान तत्व से बड़ा एक तत्व ढूंढेंगे और फिर हम सरणी में उस तत्व को ढूंढेंगे जो इस बड़े तत्व से छोटा है। और यदि सरणी में कोई अगला छोटा या अगला बड़ा तत्व मौजूद नहीं है तो -1 वापस करें।

आइए एक उदाहरण से समस्या को समझते हैं,

इनपुट

arr[] = {4, 2, 8, 3, 9, 1}

आउटपुट

{3, 3, 1, 1, -1, -1}

व्याख्या

अगले बड़े तत्वों की सरणी : {8, 8, 9, 9, -1, -1} चूंकि 9 सरणी का सबसे बड़ा तत्व है और 1 अंतिम तत्व है, उनके पास अगला बड़ा तत्व नहीं है।

अगले बड़े के अगले छोटे तत्वों की सरणी : {3, 3, 1, 1, -1, -1}

समाधान दृष्टिकोण

इस समस्या का एक सरल समाधान सरणी पर पुनरावृति करना और सरणी के प्रत्येक तत्व के लिए,

  • सरणी से अगला बड़ा तत्व ढूंढें।

  • शेष सरणी में इस बड़े तत्व से छोटा तत्व ढूंढें।

यह समाधान अपना काम करता है लेकिन समय जटिलता O(n2) कोटि की है।

एक बेहतर समाधान स्टैक और तत्वों के इंडेक्स का उपयोग करके समस्या को हल करना हो सकता है।

हम वर्तमान तत्व के अगले बड़े और छोटे तत्व के इंडेक्स को दो सरणियों nextGreater[] और nextSmaller[] में स्टोर करेंगे। इसका मतलब है कि सरणी nextGreater वर्तमान तत्व के अगले बड़े तत्व का इंडेक्स स्टोर करेगी। उदाहरण के लिए nextGreater[i] में अगले बड़े तत्व का इंडेक्स होगा जो arr[nextGreater[i]] होगा। और वही nextSmaller[] के लिए भी होगा।

तो, सरणी के अगले बड़े तत्व के अगले सबसे छोटे तत्व को एक्सेस करने के लिए। हम nextGreater[i] पर इंडेक्स के अगले छोटे तत्व को ढूंढेंगे। यह हमारे आवश्यक तत्व का इंडेक्स देगा, यानी आवश्यक तत्व arr[nextSmaller[nextGreater[i]]] है।

तत्व ढूंढने के लिए, हम स्टैक डेटा संरचना का उपयोग करेंगे जो शेष उपसरणी के तत्वों को स्टोर करेगा। यहां फ़ंक्शन बड़े तत्व ढूंढने के लिए कैसे काम करेगा।

  • => हम सरणी को अंत से पार करेंगे, i -> n-1 से 0 तक।

  • => यदि स्टैक खाली नहीं है और स्टैक का शीर्ष वर्तमान तत्व से छोटा है -> पॉप S, ऐसा तब तक करें जब तक बड़ा तत्व न मिल जाए या स्टैक खाली न हो जाए।

  • => यदि स्टैक खाली है -> कोई बड़ा तत्व संभव नहीं, -1 स्टोर करें, nextGreater[i] = -1।

  • => अन्यथा -> अगला बड़ा तत्व स्टैक के शीर्ष पर है, स्टैक का शीर्ष स्टोर करें, nextGreater[i] = stack.top()।

  • => वर्तमान तत्व को स्टैक में पुश करें, stack.push()

उसी विधि का उपयोग सरणी के वर्तमान तत्व के लिए अगला छोटा तत्व ढूंढने के लिए किया जा सकता है। और एक बार जब हमें दोनों के इंडेक्स मिल जाते हैं। हम इन इंडेक्स का उपयोग सरणी से आवश्यक तत्व ढूंढने के लिए कर सकते हैं।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला प्रोग्राम,

उदाहरण

#include<bits/stdc++.h> using namespace std; void findNextGreater(int arr[], int n, int next[]) {    stack<int> nextGreater;    int i = n-1;    while(i >= 0) {       while (!nextGreater.empty() && arr[nextGreater.top()] <= arr[i] )          nextGreater.pop();       if (!nextGreater.empty())          next[i] = nextGreater.top();       else          next[i] = -1;       nextGreater.push(i);       i--;    } } void findNextSmaller(int arr[], int n, int next[]) {    stack<int> nextSmaller;    int i = n-1 ;    while(i >= 0){       while (!nextSmaller.empty() && arr[nextSmaller.top()] >= arr[i])          nextSmaller.pop();       if (!nextSmaller.empty())          next[i] = nextSmaller.top();       else          next[i] = -1;       nextSmaller.push(i);       i -- ;    } } void findNextSmallerofNextGreaterElemenetArray(int arr[], int n) {    int nextGreaterIndex[n];    int nextSmallerIndex[n];    findNextGreater(arr, n, nextGreaterIndex);    findNextSmaller(arr, n, nextSmallerIndex);    for (int i=0; i< n; i++){       if (nextGreaterIndex[i] != -1 && nextSmallerIndex[nextGreaterIndex[i]] != -1)          cout<<arr[nextSmallerIndex[nextGreaterIndex[i]]]<<"\t";       else          cout<<"-1"<<"\t";    } } int main(){    int arr[] = {4, 2, 8, 3, 9, 1};    int n = sizeof(arr)/sizeof(arr[0]);    cout<<"All next smaller of next greater elements of the array are ";    findNextSmallerofNextGreaterElemenetArray(arr, n);    return 0; }

आउटपुट

All next smaller of next greater elements of the array are 3 3 1 1 -1 -1

  1. - C++ प्रोग्राम: सरणी में प्रत्येक तत्व के लिए निकटतम बड़ा मान ज्ञात करना

    यहां हम देखेंगे कि सरणी में प्रत्येक तत्व के लिए निकटतम बड़ा मान कैसे ज्ञात करें। यदि किसी तत्व x का अगला तत्व जो उससे बड़ा है, और सरणी में भी मौजूद है, तो वह उस तत्व का बड़ा मान होगा। यदि तत्व मौजूद नहीं है, तो -1 लौटाएं। मान लें सरणी तत्व [10, 5, 11, 6, 20, 12] हैं, तो बड़े तत्व [11, 6, 12, 10, -1

  1. - C++ में सरणी के प्रत्येक तत्व का सरपासर काउंट खोजें

    मान लीजिए एक सरणी A दी गई है। हमें उस सरणी में प्रत्येक तत्व के सरपासर की संख्या ज्ञात करनी है। सरपासर वे बड़े तत्व हैं जो वर्तमान तत्व के दाईं ओर सरणी में मौजूद हैं। मान लीजिए A = {2, 7, 5, 3, 0, 8, 1}, सरपासर हैं {4, 1, 1, 1, 2, 0, 0}, इसलिए 2 के दाईं ओर 4 संख्याएं हैं जो 2 से बड़ी हैं, और इसी नि

  1. - C++ में सरणी का सबसे बड़ा एलिमेंट खोजने का प्रोग्राम

    एक सरणी में कई एलिमेंट्स होते हैं और सरणी में सबसे बड़ा एलिमेंट वह होता है जो अन्य एलिमेंट्स से बड़ा होता है। उदाहरण के लिए। 5 1 7 2 4 उपरोक्त सरणी में, 7 सबसे बड़ा एलिमेंट है और यह इंडेक्स 2 पर है। सरणी का सबसे बड़ा एलिमेंट खोजने का एक प्रोग्राम निम्नलिखित है। उदाहरण #include <iostream>