इस समस्या में, हमें n तत्वों वाली एक सरणी arr दी गई है जो या तो 0 या 1 हैं। हमारा कार्य पड़ोसियों को भरकर न्यूनतम पुनरावृत्तियों का उपयोग करके सरणी को 1 से भरना है।
समस्या को समझने के लिए एक उदाहरण लेते हैं,
इनपुट: arr[] = {0, 1, 1, 0, 0, 1}
आउटपुट: 1
समाधान दृष्टिकोण
समस्या को हल करने के लिए, हमें यह तथ्य जानना होगा कि यदि 1 किसी स्थिति में मौजूद है तो यह दो पड़ोसी 0 को 1 में बदल सकता है।
यदि, arr[i] 1 है।
तो, arr[i-1] और arr[i+1] को 1 में बदल दिया जाएगा।
इसका उपयोग करके, समाधान इन मामलों में से एक का उपयोग करके पाया जा सकता है -
केस 1: ब्लॉक में शुरुआत और अंत में 1 हैं। बाकी सभी मान 0 हैं। शून्य की संख्या गिनें।
पुनरावृत्तियों की संख्या = zeroCount / 2 यदि गिनती सम है
पुनरावृत्तियों की संख्या = (zeroCount -1)/2 यदि गिनती विषम है
केस 2: ब्लॉक में शुरुआत या अंत में एकल 1 है और बाकी सभी मान 0 हैं।
पुनरावृत्तियों की संख्या = zeroCount
केस 3: ब्लॉक में कोई 1 नहीं है। -1 प्रिंट करें जो दर्शाता है कि 1 भरना संभव नहीं है।
हमारे समाधान की कार्यप्रणाली को दर्शाने वाला प्रोग्राम,
उदाहरण
#include<iostream>
using namespace std;
int countIterationFill1(int arr[], int n) {
bool oneFound = false;
int iterationCount = 0;
for (int i=0; i<n; ) {
if (arr[i] == 1)
oneFound = true;
while (i<n && arr[i]==1)
i++;
int zeroCount = 0;
while (i<n && arr[i]==0) {
zeroCount++;
i++;
}
if (oneFound == false && i == n)
return -1;
int itrCount;
if (i < n && oneFound == true) {
if (zeroCount & 1 == 0)
itrCount = zeroCount/2;
else
itrCount = (zeroCount+1)/2;
zeroCount = 0;
}
else{
itrCount = zeroCount;
zeroCount = 0;
}
iterationCount = max(iterationCount, itrCount);
}
return iterationCount;
}
int main() {
int arr[] = {0, 1, 1, 0, 0, 1, 0, 0, 0, 1};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The number of iterations to fill 1's is "<<countIterationFill1(arr, n);
return 0;
}
आउटपुट
The number of iterations to fill 1's is 2