मान लीजिए कि हमारे पास एक सरणी 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