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

C++ में आकार K की प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक खोजना

समस्या विवरण

इस समस्या में, हमें N पूर्णांक मानों वाली एक सरणी arr[] और आकार K की एक विंडो दी गई है। हमारा कार्य आकार K की प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक खोजने के लिए एक प्रोग्राम बनाना है। यदि ऋणात्मक संख्या मौजूद है तो हम पहले ऋणात्मक संख्या को प्रिंट करेंगे अन्यथा 0 प्रिंट करेंगे, जो दर्शाता है कि कोई ऋणात्मक मौजूद नहीं है।

उदाहरण

इनपुट: arr[] = {-2, 2, -1, 4, 3, -6}, k = 2
आउटपुट: -2, -1, -1, 0, -6

व्याख्या

विंडो आकार k = 2:
{-2, 2}, पहला ऋणात्मक -2
{2, -1}, पहला ऋणात्मक -1
{-1, 4}, पहला ऋणात्मक -1
{4, 3}, पहला ऋणात्मक 0 (कोई ऋणात्मक नहीं)
{3, -6}, पहला ऋणात्मक -6

हल का दृष्टिकोण

विधि 1: नेस्टेड लूप (O(N×K)) - भोला

समस्या को हल करने का एक सरल तरीका सरणी arr[] को पार करके आकार K की विंडो बनाना है। और प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक खोजना और प्रिंट करना।

#include <iostream> 
using namespace std; 

void findFirstNegIntWindowK(int arr[], int n, int k) {
    bool negFound;
    for (int i = 0; i < (n - k + 1); i++) {
        negFound = false;
        for (int j = 0; j < k; j++) {
            if (arr[i + j] < 0) {
                cout << arr[i + j] << "\t";
                negFound = true;
                break;
            }
        }
        if (!negFound)
            cout << "0\t";
    }
}

int main() {
    int arr[] = {-2, 2, -1, 4, 3, -6};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;
    cout << "आकार " << k << " की प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक है:\n";
    findFirstNegIntWindowK(arr, n, k);
    return 0;
}

विधि 2: स्लाइडिंग विंडो के साथ डीक्यू (O(N)) - इष्टतम

समस्या को हल करने का एक अन्य तरीका स्लाइडिंग विंडो अवधारणा का उपयोग करना है। इसके लिए, हम वर्तमान विंडो के सभी ऋणात्मक तत्वों के इंडेक्स को संग्रहीत करने के लिए आकार K का एक डीक्यू (डबल-एंडेड क्यू) बनाएंगे। हम सरणी की शुरुआत से पार करना शुरू करेंगे और आकार K के डीक्यू में तत्व भरेंगे। और फिर, सरणी के प्रत्येक तत्व के लिए, हम एक छोर से एक तत्व हटाएंगे और दूसरे में जोड़ेंगे। प्रत्येक स्लाइड की गई विंडो के लिए हम पहला ऋणात्मक संख्या खोजेंगे और प्रिंट करेंगे।

#include <bits/stdc++.h> 
using namespace std; 

void findFirstNegIntWindowK(int arr[], int n, int k) {
    deque<int> dq; // ऋणात्मक तत्वों के इंडेक्स संग्रहीत करता है
    
    // पहली विंडो प्रोसेस करें
    for (int i = 0; i < k; i++) {
        if (arr[i] < 0)
            dq.push_back(i);
    }
    
    // शेष विंडो प्रोसेस करें
    for (int i = k; i < n; i++) {
        // पिछली विंडो का उत्तर प्रिंट करें
        if (!dq.empty())
            cout << arr[dq.front()] << "\t";
        else
            cout << "0\t";
        
        // विंडो से बाहर के इंडेक्स हटाएं
        while (!dq.empty() && dq.front() <= i - k)
            dq.pop_front();
        
        // वर्तमान तत्व जोड़ें यदि ऋणात्मक है
        if (arr[i] < 0)
            dq.push_back(i);
    }
    
    // अंतिम विंडो प्रिंट करें
    if (!dq.empty())
        cout << arr[dq.front()] << "\t";
    else
        cout << "0\t";
}

int main() {
    int arr[] = {-2, 2, -1, 4, 3, -6};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;
    cout << "आकार " << k << " की प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक है:\n";
    findFirstNegIntWindowK(arr, n, k);
    return 0;
}

आउटपुट

आकार 2 की प्रत्येक विंडो में पहला ऋणात्मक पूर्णांक है:
-2  -1  -1  0  -6

जटिलता विश्लेषण

विधिसमय जटिलतास्पेस जटिलता
नेस्टेड लूपO(N×K)O(1)
डीक्यू + स्लाइडिंग विंडोO(N)O(K)
  1. - C++ में दिए गए योग के साथ अधिकतम आकार का सबसेट

    समस्या कथनN तत्वों का एक एरे और योग दिया गया है। हमें उस अधिकतम आकार के सबसेट का आकार ढूंढना है जिसका योग दिए गए योग के बराबर हो।उदाहरणयदि इनपुट एरे arr = { 2, 3, 5, 10 } है और योग = 20 है तो आउटपुट 4 होगा क्योंकि −2 + 3 + 5 + 10 = 20 जो दिए गए योग के बराबर है।एल्गोरिदमहम इस समस्या को हल करने

  1. - C++ में दिए गए आकार के सेट के सभी उपसमुच्चय (Subsets) प्रिंट करें

    इस समस्या में, हमें एक सरणी दी गई है और हमें दिए गए आकार r के उन सभी उपसमुच्चय को प्रिंट करना है जो सरणी के तत्वों का उपयोग करके बनाए जा सकते हैं। विषय को बेहतर ढंग से समझने के लिए एक उदाहरण लेते हैं - इनपुट: सरणी = {3, 5, 6} r = 2 आउटपुट: 3 5 3 6 5 6 इस समस्या में, हमें सरणी की संख्याओं के सभी संयो

  1. - C++ में आकार K के M नॉन-ओवरलैपिंग सबएरे का अधिकतम योग

    समस्या कथन एक ऐरे और दो संख्याएं M और K दी गई हैं। हमें ऐरे में आकार K के अधिकतम M सबएरे का योग ढूंढना है (नॉन-ओवरलैपिंग)। (ऐरे का क्रम अपरिवर्तित रहता है)। K सबएरे का आकार है और M सबएरे की संख्या है। यह माना जा सकता है कि ऐरे का आकार m*k से अधिक है। यदि कुल ऐरे का आकार k का गुणक नहीं है, तो हम आंश