Given an array of 0s and 1s, in how many iterations the whole array can be filled with 1s if in a single iteration immediate neighbors of 1s can be filled.
Note: if we cannot fill array with 1s, then print "-1" .
Examples :
Input : arr[] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1}
Output : 1
Explanation:
To convert the whole array into 1s, one iteration is required. Between indexes i=2 and i=5, the zero at i=3 would be converted to '1' due to its neighbours at i=2 similarly the zero at i=4 would be converted into '1' due to its neighbor at i=5, all this can be done in a single iteration.
Similarly all 0's can be converted to 1 in single iteration.Input : arr[] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1}
Output : 2
Asked in : Amazon
It is given that a single 1 can convert both its 0 neighbours to 1. This problem boils down to three cases :
Case 1 : A block of 0s has 1s on both sides
Let count_zero be the count of zeros in the block.
Number of iterations are always equal to :
count_zero/2 if (count_zero is even)
count_zero+1)/2 if(count_zero is odd).
Case 2 : Either single 1 at the end or in
the starting. For example 0 0 0 0 1 and
1 0 0 0 0
In this case the number of iterations required will
always be equal to number of zeros.
Case 3 : There are no 1s (Array has only 0s)
In this case array can't be filled with all 1's.
So print -1.
Algorithm :
1-Start traversing the array.
(a) Traverse until a 0 is found.
while (i < n && a[i] == 1)
{
i++;
flag=true;
}
Flag is set to true just to check at
the last if array contains any 1 or not.
(b) Traverse until a 1 is found and Count
contiguous 0 .
while (i < n && a[i] == 0)
{
count_zero++;
i++;
}
(c) Now check which case is satisfied by
current subarray. And update iterations
using count and update max iterations.
Implementation:
// C++ program to find number of iterations
// to fill with all 1s
#include<bits/stdc++.h>
using namespace std;
// Returns count of iterations to fill arr[]
// with 1s.
int countIterations(int arr[], int n)
{
bool oneFound = false;
int res = 0;
// Start traversing the array
for (int i=0; i<n; )
{
if (arr[i] == 1)
oneFound = true;
// Traverse until a 0 is found
while (i<n && arr[i]==1)
i++;
// Count contiguous 0s
int count_zero = 0;
while (i<n && arr[i]==0)
{
count_zero++;
i++;
}
// Condition for Case 3
if (oneFound == false && i == n)
return -1;
// Condition to check if Case 1 satisfies:
int curr_count;
if (i < n && oneFound == true)
{
// If count_zero is even
if (count_zero & 1 == 0)
curr_count = count_zero/2;
// If count_zero is odd
else
curr_count = (count_zero+1)/2;
// Reset count_zero
count_zero = 0;
}
// Case 2
else
{
curr_count = count_zero;
count_zero = 0;
}
// Update res
res = max(res, curr_count);
}
return res;
}
// Driver code
int main()
{
int arr[] = {0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0};
int n = sizeof(arr) / sizeof(arr[0]);
cout << countIterations(arr, n);
return 0;
}
// Java program to find number of iterations
// to fill with all 1s
class Test
{
// Returns count of iterations to fill arr[]
// with 1s.
static int countIterations(int arr[], int n)
{
boolean oneFound = false;
int res = 0;
// Start traversing the array
for (int i=0; i<n; )
{
if (arr[i] == 1)
oneFound = true;
// Traverse until a 0 is found
while (i<n && arr[i]==1)
i++;
// Count contiguous 0s
int count_zero = 0;
while (i<n && arr[i]==0)
{
count_zero++;
i++;
}
// Condition for Case 3
if (oneFound == false && i == n)
return -1;
// Condition to check if Case 1 satisfies:
int curr_count;
if (i < n && oneFound == true)
{
// If count_zero is even
if ((count_zero & 1) == 0)
curr_count = count_zero/2;
// If count_zero is odd
else
curr_count = (count_zero+1)/2;
// Reset count_zero
count_zero = 0;
}
// Case 2
else
{
curr_count = count_zero;
count_zero = 0;
}
// Update res
res = Math.max(res, curr_count);
}
return res;
}
// Driver method
public static void main(String[] args)
{
int arr[] = {0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0};
System.out.println(countIterations(arr, arr.length));
}
}
# Python3 program to find number
# of iterations to fill with all 1s
# Returns count of iterations
# to fill arr[] with 1s.
def countIterations(arr, n):
oneFound = False;
res = 0;
i = 0;
# Start traversing the array
while (i < n):
if (arr[i] == 1):
oneFound = True;
# Traverse until a 0 is found
while (i < n and arr[i] == 1):
i += 1;
# Count contiguous 0s
count_zero = 0;
while (i < n and arr[i] == 0):
count_zero += 1;
i += 1;
# Condition for Case 3
if (oneFound == False and i == n):
return -1;
# Condition to check
# if Case 1 satisfies:
curr_count = 0;
if (i < n and oneFound == True):
# If count_zero is even
if ((count_zero & 1) == 0):
curr_count = count_zero // 2;
# If count_zero is odd
else:
curr_count = (count_zero + 1) // 2;
# Reset count_zero
count_zero = 0;
# Case 2
else:
curr_count = count_zero;
count_zero = 0;
# Update res
res = max(res, curr_count);
return res;
# Driver code
arr = [0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0];
n = len(arr);
print(countIterations(arr, n));
# This code is contributed by mits
// C# program to find number of
// iterations to fill with all 1s
using System;
class Test {
// Returns count of iterations
// to fill arr[] with 1s.
static int countIterations(int []arr, int n)
{
bool oneFound = false;
int res = 0;
// Start traversing the array
for (int i = 0; i < n; )
{
if (arr[i] == 1)
oneFound = true;
// Traverse until a 0 is found
while (i < n && arr[i] == 1)
i++;
// Count contiguous 0s
int count_zero = 0;
while (i < n && arr[i] == 0)
{
count_zero++;
i++;
}
// Condition for Case 3
if (oneFound == false && i == n)
return -1;
// Condition to check if
// Case 1 satisfies:
int curr_count;
if (i < n && oneFound == true)
{
// If count_zero is even
if ((count_zero & 1) == 0)
curr_count = count_zero / 2;
// If count_zero is odd
else
curr_count = (count_zero + 1) / 2;
// Reset count_zero
count_zero = 0;
}
// Case 2
else
{
curr_count = count_zero;
count_zero = 0;
}
// Update res
res = Math.Max(res, curr_count);
}
return res;
}
// Driver code
public static void Main()
{
int []arr = {0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0};
Console.Write(countIterations(arr, arr.Length));
}
}
// This code is contributed by nitin mittal.
<?php
// PHP program to find number
// of iterations to fill with all 1s
// Returns count of iterations
// to fill arr[] with 1s.
function countIterations($arr, $n)
{
$oneFound = false;
$res = 0;
// Start traversing the array
for ( $i = 0; $i < $n; )
{
if ($arr[$i] == 1)
$oneFound = true;
// Traverse until a 0 is found
while ($i < $n && $arr[$i] == 1)
$i++;
// Count contiguous 0s
$count_zero = 0;
while ($i < $n && $arr[$i] == 0)
{
$count_zero++;
$i++;
}
// Condition for Case 3
if ($oneFound == false && $i == $n)
return -1;
// Condition to check
// if Case 1 satisfies:
$curr_count;
if ($i < $n && $oneFound == true)
{
// If count_zero is even
if ($count_zero & 1 == 0)
$curr_count = $count_zero / 2;
// If count_zero is odd
else
$curr_count = ($count_zero + 1) / 2;
// Reset count_zero
$count_zero = 0;
}
// Case 2
else
{
$curr_count = $count_zero;
$count_zero = 0;
}
// Update res
$res = max($res, $curr_count);
}
return $res;
}
// Driver code
$arr = array(0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0);
$n = sizeof($arr) / sizeof($arr[0]);
echo countIterations($arr, $n);
// This code is contributed by nitin mittal.
?>
<script>
// Javascript program to find number of
// iterations to fill with all 1s
// Returns count of iterations to fill arr[]
// with 1s.
function countIterations(arr, n)
{
var oneFound = false;
var res = 0;
// Start traversing the array
for(var i = 0; i < n; )
{
if (arr[i] == 1)
oneFound = true;
// Traverse until a 0 is found
while (i < n && arr[i] == 1)
i++;
// Count contiguous 0s
var count_zero = 0;
while (i < n && arr[i] == 0)
{
count_zero++;
i++;
}
// Condition for Case 3
if (oneFound == false && i == n)
return -1;
// Condition to check if Case 1 satisfies:
var curr_count;
if (i < n && oneFound == true)
{
// If count_zero is even
if ((count_zero & 1) == 0)
curr_count = count_zero / 2;
// If count_zero is odd
else
curr_count = (count_zero + 1) / 2;
// Reset count_zero
count_zero = 0;
}
// Case 2
else
{
curr_count = count_zero;
count_zero = 0;
}
// Update res
res = Math.max(res, curr_count);
}
return res;
}
// Driver Code
var arr = [ 0, 1, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0 ];
document.write(countIterations(arr, arr.length));
// This code is contributed by Ankita saini
</script>
Output
4
Time Complexity: O(n)
Auxiliary Space: O(1)