Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Fill array with 1's using minimum iterations of filling neighbors in C++
In this problem, we are given an array arr consisting of n elements that are either 0 or 1. Our task is to fill array with 1’s using minimum iterations of filling neighbors.
Let’s take an example to understand the problem,
Input: arr[] = {0, 1, 1, 0, 0, 1}
Output: 1
Solution Approach −
To solve the problem, we need to know the fact that if 1 is present in a position it can convert two neighbouring 0’s to 1.
If, arr[i] is 1.
Then, arr[i-1] and arr[i+1] will be converted to 1.
Using this, the solution can be found using one of these case −
Case 1: Block has 1’s at start and end of the block. Rest all values are 0. Count the number of zeros.
Number of iterations = zeroCount / 2 if count is even
Number of iteration = (zeroCount -1)/2 if count is odd
Case 2: Block has single 1 at start or end of the block and rest all values are 0.
Number of iterations = zeroCount
Case 3: Block has no 1’s. Print -1 denoting filling of 1’s not possible.
Program to illustrate the working of our solution,
Example
#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;
}
Output −
The number of iterations to fill 1's is 2