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

C++ में शून्यों को फ्लिप करके अधिकतम लगातार 1s प्राप्त करना


परिचय

इस ट्यूटोरियल में हम उन शून्यों (zeroes) की संख्या ढूंढेंगे जिन्हें फ्लिप करके सरणी में अधिकतम लगातार 1s प्राप्त किए जा सकते हैं।

हम इस समस्या को हल करने के लिए स्लाइडिंग विंडो (sliding window) दृष्टिकोण का उपयोग करेंगे।

समस्या समाधान के चरण

  1. सरणी और फ्लिप किए जा सकने वाले अधिकतम शून्यों को इनिशियलाइज़ करें।
  2. विंडो प्रारंभ, अंत इंडेक्स और लंबाई इनिशियलाइज़ करें।
  3. लगातार 1s की अधिकतम सब-सरणी की लंबाई और प्रारंभिक इंडेक्स स्टोर करें।
  4. सरणी पर पुनरावृत्ति करें जब तक अंत इंडेक्स सरणी की लंबाई पार न कर जाए।
  5. यदि शून्यों की संख्या अधिकतम शून्यों से कम या बराबर है तो अंत इंडेक्स बढ़ाएं और यदि वर्तमान मान शून्य है तो शून्यों की संख्या बढ़ाएं।
  6. यदि शून्यों की संख्या अधिकतम से अधिक है तो प्रारंभ इंडेक्स बढ़ाएं और यदि वर्तमान मान शून्य है तो शून्यों की संख्या घटाएं।
  7. यदि वर्तमान विंडो लंबाई पिछली से अधिक है तो अधिकतम विंडो अपडेट करें।
  8. सरणी पर पुनरावृत्ति करें और विंडो प्रारंभ इंडेक्स का उपयोग करके शून्य इंडेक्स प्रिंट करें।

उदाहरण कोड

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

void zeroesIndexes(int arr[], int maxZeroes, int n) {
    int start = 0, end = 0;
    int zeroesCount = 0;
    int bestWindowCount = 0, bestWindowStartIndex = 0;
    while (end < n) {
        if (zeroesCount <= maxZeroes) {
            if (arr[end] == 0) {
                zeroesCount++;
            }
            end++;
        }
        if (zeroesCount > maxZeroes) {
            if (arr[start] == 0) {
                zeroesCount--;
            }
            start++;
        }
        if ((end - start > bestWindowCount) && (zeroesCount <= maxZeroes)) {
            bestWindowCount = end - start;
            bestWindowStartIndex = start;
        }
    }
    cout << "The indexes are ";
    for (int i = 0; i < bestWindowCount; ++i) {
        if(arr[bestWindowStartIndex + i] == 0)
            cout << bestWindowStartIndex + i << " ";
    }
}

int main() {
    int arr[] = {1, 0, 0, 1, 1, 0, 1, 0, 1, 1};
    int maxZeroes = 2;
    zeroesIndexes(arr, maxZeroes, 10);
    return 0;
}

आउटपुट

The indexes are 5 7

व्याख्या

सरणी: [1, 0, 0, 1, 1, 0, 1, 0, 1, 1], maxZeroes = 2

इंडेक्स 5 और 7 पर शून्यों को फ्लिप करने से अधिकतम लगातार 1s (इंडेक्स 3 से 9 तक: 1,1,1,1,1,1,1) प्राप्त होते हैं।

निष्कर्ष

स्लाइडिंग विंडो तकनीक इस समस्या को O(n) समय में हल करती है। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. - C++ का उपयोग करके पेल संख्या ज्ञात करना

    दिए गए समस्या में, हमें एक पूर्णांक n दिया गया है और हमें Pₙ ज्ञात करना है, यानी उस स्थिति में पेल संख्या। अब, जैसा कि हम जानते हैं, पेल संख्या एक श्रृंखला का हिस्सा है जो इस सूत्र द्वारा दी जाती है: Pₙ = 2*Pₙ₋₁ + Pₙ₋₂ पहली दो शुरुआती संख्याओं के साथ: P₀ = 0 और P₁ = 1 समाधान का दृष्टिकोण अब हम इस

  1. C++ में आधार B में N! के प्रतिनिधित्व में अनुगामी शून्यों की संख्या C++ में आधार B में N! के प्रतिनिधित्व में अनुगामी शून्यों की संख्या

    इस लेख में, हम किसी दी गई संख्या N के फैक्टोरियल के आधार B प्रतिनिधित्व में अनुगामी शून्यों को खोजने की समस्या को समझेंगे। उदाहरण के लिएइनपुट: N = 7 आधार = 2 आउटपुट: 4 व्याख्या: fact(7) = 5040 बेस10 में और 1001110110000 बेस16 में जिसमें 4 अनुगामी शून्य हैं। इनपुट: N = 11 आधार = 5 आउटपुट: 2 व्याख्या:

  1. C++ में आधार 16 में N! के प्रतिनिधित्व में अनुगामी शून्यों की संख्या C++ में आधार 16 में N! के प्रतिनिधित्व में अनुगामी शून्यों की संख्या

    इस लेख में, हम किसी दी गई संख्या N के फैक्टोरियल के आधार 16 प्रतिनिधित्व में अनुगामी शून्यों को खोजने की समस्या को समझेंगे, उदाहरण के लिएइनपुट: N = 7 आउटपुट: 1 व्याख्या: fact(7) = 5040 बेस10 में और 13B0 बेस16 में जिसमें 1 अनुगामी शून्य है। इनपुट: N = 11 आउटपुट: 2 व्याख्या: fact(11) = 39916800 बेस10