📜  Java程序计算排序二进制数组中的1

📅  最后修改于: 2022-05-13 01:54:42.429000             🧑  作者: Mango

Java程序计算排序二进制数组中的1

给定一个按非递增顺序排序的二进制数组,计算其中 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) 时间内找到计数。这个想法是使用二分搜索查找 1 的最后一次出现。一旦我们找到最后一次出现的索引,我们就返回 index + 1 作为计数。
以下是上述思想的实现。

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
/*package whatever //do not write package name here */
import java.io.*;
  
class GFG 
{
      
static int countOnes(int arr[], int n)
{
    int ans;
    int low = 0, high = n - 1;
    while (low <= high) { // get the middle index
        int mid = (low + high) / 2;
   
        // else recur for left side
        if (arr[mid] < 1)
            high = mid - 1;
        
        // If element is not last 1, recur for right side
        else if (arr[mid] > 1)
            low = mid + 1;
        else
            
        // check if the element at middle index is last 1
        {
            if (mid == n - 1 || arr[mid + 1] != 1)
                return mid + 1;
            else
                low = mid + 1;
        }
    }
    return 0;
}
      
  // Driver code
    public static void main (String[] args) {
          
        int arr[] = { 1, 1, 1, 1, 0, 0, 0 };
        int n = arr.length;
          
        System.out.println("Count of 1's in given array is "+ countOnes(arr, n));
    }
}
  
// This code is contributed by patel2127.


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

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

空间复杂度 o(log n) (函数调用栈)

迭代解决方案的相同方法是

Java

/*package whatever //do not write package name here */
import java.io.*;
  
class GFG 
{
      
static int countOnes(int arr[], int n)
{
    int ans;
    int low = 0, high = n - 1;
    while (low <= high) { // get the middle index
        int mid = (low + high) / 2;
   
        // else recur for left side
        if (arr[mid] < 1)
            high = mid - 1;
        
        // If element is not last 1, recur for right side
        else if (arr[mid] > 1)
            low = mid + 1;
        else
            
        // check if the element at middle index is last 1
        {
            if (mid == n - 1 || arr[mid + 1] != 1)
                return mid + 1;
            else
                low = mid + 1;
        }
    }
    return 0;
}
      
  // Driver code
    public static void main (String[] args) {
          
        int arr[] = { 1, 1, 1, 1, 0, 0, 0 };
        int n = arr.length;
          
        System.out.println("Count of 1's in given array is "+ countOnes(arr, n));
    }
}
  
// This code is contributed by patel2127.
输出
Count of 1's in given array is 4

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

空间复杂度为 O(1)

有关详细信息,请参阅有关排序二进制数组中计数 1 的完整文章!