给定一个0和1的数组,如果在一次迭代中可以填充1的直接邻居,则在整个迭代中可以用1填充整个数组。
注意:如果我们不能用1s填充数组,请打印“ -1”。
例子 :
Input : arr[] = {1, 0, 1, 0, 0, 1, 0, 1,
1, 0, 1, 1, 0, 0, 1}
Output : 1
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
在询问:亚马逊
假定单个1可以将其0个邻居都转换为1。此问题归结为三种情况:
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.
算法 :
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.
C++
// C++ program to find number of iterations
// to fill with all 1s
#include
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
Java
// 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
Python3
# 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#
// 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
输出 :
4
时间复杂度: O(n)