📜  找出零

📅  最后修改于: 2021-04-24 20:54:46             🧑  作者: Mango

给定一个由1和0组成的数组,该数组先是全1,然后是全0。找出0的数量。计算给定数组中的零个数。

例子 :

Input: arr[] = {1, 1, 1, 1, 0, 0}
Output: 2

Input: arr[] = {1, 0, 0, 0, 0}
Output: 4

Input: arr[] = {0, 0, 0}
Output: 3

Input: arr[] = {1, 1, 1, 1}
Output: 0

一个简单的解决方案是遍历输入数组。一旦找到0,我们将返回n –第一个0的索引。这里n是输入数组中的元素数。该解决方案的时间复杂度为O(n)。

由于对输入数组进行了排序,因此我们可以使用二进制搜索找到第一个出现的0。一旦有了第一个元素的索引,我们就可以将count返回为n –第一个零的索引。

C
// A divide and conquer solution to find count of zeroes in an array
// where all 1s are present before all 0s
#include 
  
/* if 0 is present in arr[] then returns the index of FIRST occurrence
   of 0 in arr[low..high], otherwise returns -1 */
int firstZero(int arr[], int low, int high)
{
    if (high >= low)
    {
        // Check if mid element is first 0
        int mid = low + (high - low)/2;
        if (( mid == 0 || arr[mid-1] == 1) && arr[mid] == 0)
            return mid;
  
        if (arr[mid] == 1)  // If mid element is not 0
            return firstZero(arr, (mid + 1), high);
        else  // If mid element is 0, but not first 0
            return firstZero(arr, low, (mid -1));
    }
    return -1;
}
  
// A wrapper over recursive function firstZero()
int countZeroes(int arr[], int n)
{
    // Find index of first zero in given array
    int first = firstZero(arr, 0, n-1);
  
    // If 0 is not present at all, return 0
    if (first == -1)
        return 0;
  
    return (n - first);
}
  
/* Driver program to check above functions */
int main()
{
    int arr[] =   {1, 1, 1, 0, 0, 0, 0, 0};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("Count of zeroes is %d", countZeroes(arr, n));
    return 0;
}


C++
// A divide and conquer solution to 
// find count of zeroes in an array
// where all 1s are present before all 0s
#include 
using namespace std;
  
/* if 0 is present in arr[] then
returns the index of FIRST occurrence
of 0 in arr[low..high], otherwise returns -1 */
int firstZero(int arr[], int low, int high)
{
    if (high >= low)
    {
        // Check if mid element is first 0
        int mid = low + (high - low) / 2;
        if ((mid == 0 || arr[mid - 1] == 1) && 
                         arr[mid] == 0)
            return mid;
  
        // If mid element is not 0
        if (arr[mid] == 1) 
            return firstZero(arr, (mid + 1), high);
          
        // If mid element is 0, but not first 0    
        else 
            return firstZero(arr, low, (mid -1));
    }
    return -1;
}
  
// A wrapper over recursive function firstZero()
int countZeroes(int arr[], int n)
{
    // Find index of first zero in given array
    int first = firstZero(arr, 0, n - 1);
  
    // If 0 is not present at all, return 0
    if (first == -1)
        return 0;
  
    return (n - first);
}
  
// Driver Code
int main()
{
    int arr[] = {1, 1, 1, 0, 0, 0, 0, 0};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Count of zeroes is "
         << countZeroes(arr, n);
    return 0;
}
  
// This code is contributed by SoumikMondal


Java
// A divide and conquer solution to find count of zeroes in an array
// where all 1s are present before all 0s
  
class CountZeros 
{
    /* if 0 is present in arr[] then returns the index of FIRST occurrence
       of 0 in arr[low..high], otherwise returns -1 */
    int firstZero(int arr[], int low, int high) 
    {
        if (high >= low) 
        {
            // Check if mid element is first 0
            int mid = low + (high - low) / 2;
            if ((mid == 0 || arr[mid - 1] == 1) && arr[mid] == 0)
                return mid;
  
            if (arr[mid] == 1) // If mid element is not 0
                return firstZero(arr, (mid + 1), high);
            else // If mid element is 0, but not first 0
                return firstZero(arr, low, (mid - 1));
        }
        return -1;
    }
  
    // A wrapper over recursive function firstZero()
    int countZeroes(int arr[], int n) 
    {
        // Find index of first zero in given array
        int first = firstZero(arr, 0, n - 1);
  
        // If 0 is not present at all, return 0
        if (first == -1)
            return 0;
  
        return (n - first);
    }
  
    // Driver program to test above functions
    public static void main(String[] args) 
    {
        CountZeros count = new CountZeros();
        int arr[] = {1, 1, 1, 0, 0, 0, 0, 0};
        int n = arr.length;
        System.out.println("Count of zeroes is " + count.countZeroes(arr, n));
    }
}


Python3
# A divide and conquer solution to
# find count of zeroes in an array
# where all 1s are present before all 0s
  
# if 0 is present in arr[] then returns
# the index of FIRST occurrence of 0 in
# arr[low..high], otherwise returns -1 
def firstZero(arr, low, high):
  
    if (high >= low):
      
        # Check if mid element is first 0
        mid = low + int((high - low) / 2)
        if (( mid == 0 or arr[mid-1] == 1)
                      and arr[mid] == 0):
            return mid
          
        # If mid element is not 0
        if (arr[mid] == 1): 
            return firstZero(arr, (mid + 1), high)
              
        # If mid element is 0, but not first 0
        else: 
            return firstZero(arr, low, (mid - 1))
      
    return -1
  
# A wrapper over recursive
# function firstZero()
def countZeroes(arr, n):
  
    # Find index of first zero in given array
    first = firstZero(arr, 0, n - 1)
  
    # If 0 is not present at all, return 0
    if (first == -1):
        return 0
  
    return (n - first)
  
# Driver Code
arr = [1, 1, 1, 0, 0, 0, 0, 0]
n = len(arr)
print("Count of zeroes is",
        countZeroes(arr, n))
  
# This code is contributed by Smitha Dinesh Semwal


C#
// A divide and conquer solution to find 
// count of zeroes in an array where all
// 1s are present before all 0s
using System;
  
class CountZeros 
{
    /* if 0 is present in arr[] then returns
       the index of FIRST occurrence of 0 in
       arr[low..high], otherwise returns -1 */
    int firstZero(int []arr, int low, int high) 
    {
        if (high >= low) 
        {
            // Check if mid element is first 0
            int mid = low + (high - low) / 2;
            if ((mid == 0 || arr[mid - 1] == 1) &&
                                 arr[mid] == 0)
                return mid;
  
            if (arr[mid] == 1) // If mid element is not 0
                return firstZero(arr, (mid + 1), high);
                  
            else // If mid element is 0, but not first 0
                return firstZero(arr, low, (mid - 1));
        }
        return -1;
    }
  
    // A wrapper over recursive function firstZero()
    int countZeroes(int []arr, int n) 
    {
        // Find index of first zero in given array
        int first = firstZero(arr, 0, n - 1);
  
        // If 0 is not present at all, return 0
        if (first == -1)
            return 0;
  
        return (n - first);
    }
  
    // Driver program to test above functions
    public static void Main() 
    {
        CountZeros count = new CountZeros();
        int []arr = {1, 1, 1, 0, 0, 0, 0, 0};
        int n = arr.Length;
        Console.Write("Count of zeroes is " + 
                       count.countZeroes(arr, n));
    }
}
  
// This code is contributed by nitin mittal.


PHP
= $low)
    {
          
        // Check if mid element is first 0
        $mid = $low + floor(($high - $low)/2);
          
        if (( $mid == 0 || $arr[$mid-1] == 1) && 
                                 $arr[$mid] == 0)
            return $mid;
  
        // If mid element is not 0
        if ($arr[$mid] == 1) 
            return firstZero($arr, ($mid + 1), $high);
          
        // If mid element is 0,
        // but not first 0    
        else
            return firstZero($arr, $low, 
                            ($mid - 1));
    }
    return -1;
}
  
// A wrapper over recursive
// function firstZero()
function countZeroes($arr, $n)
{
      
    // Find index of first 
    // zero in given array
    $first = firstZero($arr, 0, $n - 1);
  
    // If 0 is not present
    // at all, return 0
    if ($first == -1)
        return 0;
  
    return ($n - $first);
}
      
    // Driver Code
    $arr = array(1, 1, 1, 0, 0, 0, 0, 0);
    $n = sizeof($arr);
    echo("Count of zeroes is "); 
    echo(countZeroes($arr, $n));
      
// This code is contributed by nitin mittal
?>


输出:

Count of zeroes is 5 

时间复杂度:O(Logn),其中n是arr []中的元素数。