Рубрики

Количество 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, используя бинарный поиск. Как только мы находим индекс последнего вхождения, мы возвращаем индекс + 1 в качестве количества.

Ниже приведена реализация вышеприведенной идеи.

C ++

// C ++ программа для подсчета в логическом массиве
#include <iostream>

using namespace std;

  
/ * Возвращает количество единиц в arr [low..high]. Массив

   предполагается сортировать по возрастанию * /

int countOnes(bool arr[], int low, int high)

{

  if (high >= low)

  {

    // получить средний индекс

    int mid = low + (high - low)/2;

  

    // проверяем, последний ли элемент в среднем индексе 1

    if ( (mid == high || arr[mid+1] == 0) && (arr[mid] == 1))

      return mid+1;

  

    // Если элемент не последний 1, повторить для правой стороны

    if (arr[mid] == 1)

      return countOnes(arr, (mid + 1), high);

  

    // еще раз повторить для левой стороны

    return countOnes(arr, low, (mid -1));

  }

  return 0;

}

  
/ * Программа драйвера для проверки вышеуказанных функций * /

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 программа для подсчета в логическом массиве

  
# Возвращает количество единиц в arr [low..high]. Массив
# предполагается сортировать в порядке возрастания

def countOnes(arr,low,high):

      

    if high>=low:

          

        # получить средний индекс

        mid = low + (high-low)/2

          

        # проверить, последний ли элемент в среднем индексе 1

        if ((mid == high or arr[mid+1]==0) and (arr[mid]==1)):

            return mid+1

              

        # Если элемент не последний 1, повторить для правой стороны

        if arr[mid]==1:

            return countOnes(arr, (mid+1), high)

              

        # остальное повторяется для левой стороны

        return countOnes(arr, low, mid-1)

      

    return 0

  
# Функция драйвера

arr=[1, 1, 1, 1, 0, 0, 0]

print "Count of 1's in given array is",countOnes(arr, 0 , len(arr)-1)

  
# Этот код предоставлен __Devesh Agrawal__

Джава

// Java-программа для подсчета единиц в отсортированном массиве

class CountOnes

{

    / * Возвращает количество единиц в arr [low..high].

       Предполагается, что массив сортируется по возрастанию

       заказ */

    int countOnes(int arr[], int low, int high)

    {

      if (high >= low)

      {

        // получить средний индекс

        int mid = low + (high - low)/2;

  

        // проверяем, последний ли элемент в среднем индексе 1

        if ( (mid == high || arr[mid+1] == 0) &&

             (arr[mid] == 1))

          return mid+1;

  

        // Если элемент не последний 1, повторить для правой стороны

        if (arr[mid] == 1)

          return countOnes(arr, (mid + 1), high);

  

        // еще раз повторить для левой стороны

        return countOnes(arr, low, (mid -1));

      }

      return 0;

    }

  

    / * Программа драйвера для проверки вышеуказанных функций * /

    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) );

    }

}
/ * Этот код предоставлен Раджатом Мишрой * /

C #

// C # программа для подсчета 1 в отсортированном массиве

using System;

  

class GFG {

      

    / * Возвращает количество единиц в arr [low..high].

    Предполагается, что массив отсортирован в

    не увеличивающийся заказ *

    static int countOnes(int []arr, int low, int high)

    {

        if (high >= low)

        {

              

            // получить средний индекс

            int mid = low + (high - low) / 2;

      

            // проверяем, находится ли элемент посередине

            // индекс последний

            if ( (mid == high || arr[mid+1] == 0)

                               && (arr[mid] == 1))

            return mid+1;

      

            // Если элемент не последний 1, повторить

            // для правой стороны

            if (arr[mid] == 1)

                return countOnes(arr, (mid + 1), high);

      

            // еще раз повторить для левой стороны

            return countOnes(arr, low, (mid - 1));

        }

          

        return 0;

    }

  

    / * Программа драйвера для проверки вышеуказанных функций * /

    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) );

    }

}

  
// Этот код предоставлен Sam007.

PHP

<?php
// PHP программа для подсчета
// логический массив

  
/ * Возвращает количество единиц в arr [low..high].
Предполагается, что массив отсортирован в
не увеличивающийся заказ *

function countOnes( $arr, $low, $high)

{

    if ($high >= $low)

    {

        // получить средний индекс

        $mid = $low + ($high - $low)/2;

      

        // проверяем, находится ли элемент посередине

        // индекс последний

        if ( ($mid == $high or $arr[$mid+1] == 0) 

                           and ($arr[$mid] == 1))

            return $mid+1;

      

        // Если элемент не последний 1, повторить для

        // правая сторона

        if ($arr[$mid] == 1)

            return countOnes($arr, ($mid + 1),

                                          $high);

      

        // еще раз повторить для левой стороны

        return countOnes($arr, $low, ($mid -1));

    }

      

    return 0;

}

  
/ * Программа драйвера для проверки вышеуказанных функций * /

$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);

  
// Этот код предоставлен anuj_67.
?>

Выход:

Count of 1's in given array is 4

Временная сложность вышеуказанного решения составляет O (Logn)

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Количество 1 в отсортированном двоичном массиве

0.00 (0%) 0 votes