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

C++ में K लगातार बिट फ़्लिप की न्यूनतम संख्या

मान लीजिए कि हमारे पास एक सरणी A है। इसमें केवल 0s और 1s हैं, यहाँ K-बिट फ्लिप में लंबाई K का एक (सन्निहित) सबअरे चुनना और साथ ही बिट्स n सबएरे को इनवर्ट करना शामिल है। हमें K-बिट फ़्लिप की न्यूनतम संख्या ज्ञात करनी होगी ताकि सरणी में कोई 0 न हो। अगर ऐसी कोई संभावना नहीं है, तो -1 लौटें।

इसलिए, यदि इनपुट [0,0,0,1,0,1,1,0] और K =3 जैसा है, तो आउटपुट 3 होगा, क्योंकि हमें पहले प्रयास में तीन बार ऑपरेशन करने की आवश्यकता है ए [0] से ए [3] फ्लिप करें, सरणी [1,1,1,1,0,1,1,0] होगी, दूसरे रन पर ए [4] से ए [6], सरणी फ्लिप करें [1,1,1,1,1,0,0,0] होगा, और तीसरी चाल में A[5] को A[7] में बदलें, सरणी [1,1,1,1,1] होगी ,1,1,1].

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=A का आकार

  • आकार n की सरणी चालों को परिभाषित करें

  • काउंटर :=0

  • इनिशियलाइज़ i :=0 के लिए, जब i + K <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -

    • अगर मैं> 0, तो -

      • चाल [i] :=चाल[i] + चाल[i - 1]

    • यदि नहीं ((चाल [i] mod 2) + A[i]) mod 2 गैर-शून्य है, तो -

      • चाल [i] :=चाल [i] + 1

      • अगर मैं + के <एन, तो -

        • चाल [i + K] - =1

      • (काउंटर 1 से बढ़ाएं)

  • i

    • अगर मैं> 0, तो -

      • चाल [i] :=चाल[i] + चाल[i - 1]

    • यदि नहीं ((चाल [i] mod 2) + A[i]) mod 2 गैर-शून्य है, तो -

      • वापसी -1

  • वापसी काउंटर

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

आउटपुट

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minKBitFlips(vector<int>& A, int K){
      int n = A.size();
      vector<int> moves(n);
      int i;
      int counter = 0;
      for (i = 0; i + K <= n; i++) {
         if (i > 0)
         moves[i] += moves[i - 1];
         if (!(((moves[i] % 2) + A[i]) % 2)) {
            moves[i] += 1;
            if (i + K < n)
               moves[i + K] -= 1;
            counter++;
         }
      }
      for (; i < n; i++) {
         if (i > 0)
         moves[i] += moves[i - 1];
         if (!(((moves[i] % 2) + A[i]) % 2))
            return -1;
      }
      return counter;
   }
};
main(){
   Solution ob;
   vector<int> v = {0,0,0,1,0,1,1,0};
   cout << (ob.minKBitFlips(v, 3));
}

इनपुट

{0,0,0,1,0,1,1,0}, 3

आउटपुट

3

  1. सी++ में बगीचे में पानी भरने के लिए नलों की न्यूनतम संख्या

    मान लीजिए कि x-अक्ष पर एक आयामी बगीचा है। बगीचे की प्रारंभिक स्थिति 0 है, और समाप्ति स्थिति n है। बगीचे में बिंदु [0, 1, ..., n] पर स्थित n + 1 नल हैं। यदि हमारे पास एक पूर्णांक n है और एक पूर्णांक सरणी लंबाई n + 1 है, जहां रेंज [i] i-th टैप क्षेत्र को पानी दे सकता है [i - रेंज [i], i + रेंज [i]] जब

  1. C++ में ईंधन भरने के स्टॉप की न्यूनतम संख्या

    मान लीजिए कि एक कार है, जो शुरुआती स्थिति से एक गंतव्य तक जाती है, जो शुरुआती स्थिति से t मील पूर्व में है। अब रास्ते में कई गैस स्टेशन हैं। तो प्रत्येक स्टेशन [i] एक गैस स्टेशन का प्रतिनिधित्व करता है जो स्टेशन [i] [0] प्रारंभिक स्थिति से मील पूर्व में है, और उस स्टेशन में स्टेशन [i] [1] लीटर गैस

  1. C++ में बाइनरी मैट्रिक्स को ज़ीरो मैट्रिक्स में बदलने के लिए फ़्लिप की न्यूनतम संख्या

    मान लीजिए हमारे पास एक m x n बाइनरी मैट्रिक्स मैट है। एक चरण में, हम एक सेल चुन सकते हैं और उसके बिट को फ्लिप कर सकते हैं और यदि वे मौजूद हैं तो उसके चारों पड़ोसी। हमें मैट को शून्य मैट्रिक्स में बदलने के लिए आवश्यक न्यूनतम चरणों की संख्या ज्ञात करनी होगी। अगर कोई समाधान नहीं है, तो -1 लौटें। इसलिए