📜  在已排序的二进制数组中计数1

📅  最后修改于: 2021-04-24 14:35:23             🧑  作者: Mango

给定一个以非递增顺序排序的二进制数组,请计算其中的1的数量。

例子:

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

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

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

一个简单的解决方案是线性遍历数组。简单解决方案的时间复杂度为O(n)。我们可以使用二进制搜索来找到O(Logn)时间的计数。这个想法是使用Binary Search查找1的最后一次出现。一旦找到索引最后一次出现,我们将返回index +1作为计数。
以下是上述想法的实现。

C++
// C++ program to count one's in a boolean array
#include 
using namespace std;
 
/* Returns counts of 1's in arr[low..high].  The array is
   assumed to be sorted in non-increasing order */
int countOnes(bool arr[], int low, int high)
{
  if (high >= low)
  {
    // get the middle index
    int mid = low + (high - low)/2;
 
    // check if the element at middle index is last 1
    if ( (mid == high || arr[mid+1] == 0) && (arr[mid] == 1))
      return mid+1;
 
    // If element is not last 1, recur for right side
    if (arr[mid] == 1)
      return countOnes(arr, (mid + 1), high);
 
    // else recur for left side
    return countOnes(arr, low, (mid -1));
  }
  return 0;
}
 
/* Driver Code */
int main()
{
   bool arr[] = {1, 1, 1, 1, 0, 0, 0};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout << "Count of 1's in given array is " << countOnes(arr, 0, n-1);
   return 0;
}


Python
# Python program to count one's in a boolean array
 
# Returns counts of 1's in arr[low..high].  The array is
# assumed to be sorted in non-increasing order
def countOnes(arr,low,high):
     
    if high>=low:
         
        # get the middle index
        mid = low + (high-low)//2
         
        # check if the element at middle index is last 1
        if ((mid == high or arr[mid+1]==0) and (arr[mid]==1)):
            return mid+1
             
        # If element is not last 1, recur for right side
        if arr[mid]==1:
            return countOnes(arr, (mid+1), high)
             
        # else recur for left side
        return countOnes(arr, low, mid-1)
     
    return 0
 
# Driver Code
arr=[1, 1, 1, 1, 0, 0, 0]
print ("Count of 1's in given array is",countOnes(arr, 0 , len(arr)-1))
 
# This code is contributed by __Devesh Agrawal__


Java
// Java program to count 1's in a sorted array
class CountOnes
{
    /* Returns counts of 1's in arr[low..high].  The
       array is assumed to be sorted in non-increasing
       order */
    int countOnes(int arr[], int low, int high)
    {
        if (high >= low)
        {
            // get the middle index
            int mid = low + (high - low) / 2;
 
            // check if the element at middle index is last
            // 1
            if ((mid == high || arr[mid + 1] == 0)
                && (arr[mid] == 1))
                return mid + 1;
 
            // If element is not last 1, recur for right
            // side
            if (arr[mid] == 1)
                return countOnes(arr, (mid + 1), high);
 
            // else recur for left side
            return countOnes(arr, low, (mid - 1));
        }
        return 0;
    }
 
    /* Driver code */
    public static void main(String args[])
    {
        CountOnes ob = new CountOnes();
        int arr[] = { 1, 1, 1, 1, 0, 0, 0 };
        int n = arr.length;
        System.out.println("Count of 1's in given array is "
                           + ob.countOnes(arr, 0, n - 1));
    }
}
/* This code is contributed by Rajat Mishra */


Java
// C# program to count 1's in a sorted array
using System;
 
class GFG {
 
    /* Returns counts of 1's in arr[low..high].
    The array is assumed to be sorted in
    non-increasing order */
    static int countOnes(int[] arr, int low, int high)
    {
        if (high >= low)
        {
            // get the middle index
            int mid = low + (high - low) / 2;
 
            // check if the element at middle
            // index is last 1
            if ((mid == high || arr[mid + 1] == 0)
                && (arr[mid] == 1))
                return mid + 1;
 
            // If element is not last 1, recur
            // for right side
            if (arr[mid] == 1)
                return countOnes(arr, (mid + 1), high);
 
            // else recur for left side
            return countOnes(arr, low, (mid - 1));
        }
 
        return 0;
    }
 
    /* Driver code */
    public static void Main()
    {
        int[] arr = { 1, 1, 1, 1, 0, 0, 0 };
        int n = arr.Length;
 
        Console.WriteLine("Count of 1's in given "
                          + "array is "
                          + countOnes(arr, 0, n - 1));
    }
}
 
// This code is contributed by Sam007


PHP
= $low)
    {
        // get the middle index
        $mid = $low + ($high - $low)/2;
     
        // check if the element at middle
        // index is last 1
        if ( ($mid == $high or $arr[$mid+1] == 0)
                           and ($arr[$mid] == 1))
            return $mid+1;
     
        // If element is not last 1, recur for
        // right side
        if ($arr[$mid] == 1)
            return countOnes($arr, ($mid + 1),
                                          $high);
     
        // else recur for left side
        return countOnes($arr, $low, ($mid -1));
    }
     
    return 0;
}
 
/* Driver code */
$arr = array(1, 1, 1, 1, 0, 0, 0);
$n = count($arr);
echo "Count of 1's in given array is " ,
                      countOnes($arr, 0, $n-1);
 
// This code is contributed by anuj_67.
?>


Javascript


输出
Count of 1's in given array is 4

上述解决方案的时间复杂度为O(Logn)