Programa C++ para contar 1 en una array binaria ordenada

Dada una array binaria ordenada en orden no creciente, cuente el número de 1 en ella. 

Ejemplos: 

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

Una solución simple es atravesar linealmente la array. La complejidad temporal de la solución simple es O(n). Podemos usar la búsqueda binaria para encontrar el conteo en el tiempo O (Inicio de sesión). La idea es buscar la última aparición de 1 utilizando la búsqueda binaria. Una vez que encontramos la última ocurrencia del índice, devolvemos el índice + 1 como conteo.
La siguiente es la implementación de la idea anterior. 

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 isassumed to be sorted in non-increasing order */int countOnes(bool arr[], int low, int high){if (high >= low){// get the middle indexint mid = low + (high – low)/2;// check if the element at middle index is last 1if ( (mid == high || arr[mid+1] == 0) && (arr[mid] == 1))return mid+1;// If element is not last 1, recur for right sideif (arr[mid] == 1)return countOnes(arr, (mid + 1), high);// else recur for left sidereturn 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;
}[tabbyending]OutputCount of 1's in given array is 4Time complexity of the above solution is O(Logn)Space complexity o(log n) (function call stack)The same approach with iterative solution would be

C++

#include using namespace std;/* Returns counts of 1’s in arr[low..high]. The array isassumed to be sorted in non-increasing order */int countOnes(bool 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;elselow = mid + 1;}}}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, n);
return 0;
}[tabbyending]OutputCount of 1's in given array is 4Time complexity of the above solution is O(Logn)Space complexity is O(1)Please refer complete article on Count 1’s in a sorted binary array for more details!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *