Dada una array arr[] que consta de N enteros positivos, la tarea es encontrar los elementos que son mayores que al menos la mitad de los elementos de la array.
Ejemplos:
Entrada: arr[] = {1, 6, 3, 4}
Salida: 4 6
Explicación:
El tamaño de la array es 4. Los elementos que son mayores que al menos N/2 (= 4/2 = 2) elementos de la array son 4 y 6Entrada: arr[] = {10, 4, 2, 8, 9}
Salida: 10 9 8
Enfoque ingenuo: consulte la publicación anterior de este artículo para el enfoque ingenuo.
Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1)
Enfoque basado en la clasificación: consulte la publicación anterior de este artículo para conocer el enfoque basado en la clasificación .
Complejidad de tiempo: O(N*log N)
Espacio auxiliar: O(1)
Enfoque: el enfoque anterior también se puede optimizar mediante el uso de Hashing al realizar un seguimiento del recuento de elementos de la array . Después de encontrar la frecuencia de cada elemento , imprima los elementos en orden no creciente hasta que se hayan impreso N/2 elementos. Siga los pasos a continuación para resolver el problema:
- Inicialice una variable, digamos mid como (N + 1)/2 para almacenar el índice medio de la array.
- Inicialice una variable, digamos max para almacenar el elemento máximo de la array .
- Inicialice una array count[] para almacenar la frecuencia de cada elemento.
- Recorra la array , arr[] e incremente count[arr[i]] en 1.
- Atraviese thearray count[] usando la variable i desde atrás y realice los siguientes pasos:
- Iterar hasta que el valor de count[i] sea positivo y realizar los siguientes pasos:
- Imprime el valor de i y disminuye el valor de count[i] y mid en 1 .
- Si el valor de mid es 0 , salga del bucle .
- Si el valor de mid es 0 , salga del bucle .
- Iterar hasta que el valor de count[i] sea positivo y realizar los siguientes pasos:
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the element that // are larger than half of elements // of the array void findLarger(int arr[], int n) { // Find the value of mid int mid = (n + 1) / 2; // Stores the maximum element int mx = *max_element(arr, arr + n); // Stores the frequency of each // array element int count[mx + 1] = { 0 }; for (int i = 0; i < n; i++) { count[arr[i]]++; } // Traverse the array in the // reverse order for (int i = mx; i >= 0; i--) { while (count[i] > 0) { // Decrement the value // of count[i] and mid count[i]--; mid--; // Print the current element cout << i << ' '; // Check if the value of // mid is equal to 0 if (mid == 0) break; } if (mid == 0) break; } } // Driver Code int main() { int arr[] = { 10, 4, 2, 8, 9 }; int N = sizeof(arr) / sizeof(arr[0]); findLarger(arr, N); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ // Function to find the element that // are larger than half of elements // of the array static void findLarger(int arr[], int n) { // Find the value of mid int mid = (n + 1) / 2; // Stores the maximum element int mx = Arrays.stream(arr).max().getAsInt(); // Stores the frequency of each // array element int count[] = new int[mx+1]; for (int i = 0; i < mx+1; i++) { count[i] = 0; } for (int i = 0; i < n; i++) { count[arr[i]]++; } // Traverse the array in the // reverse order for (int i = mx; i >= 0; i--) { while (count[i] > 0) { // Decrement the value // of count[i] and mid count[i]--; mid--; // Print the current element System.out.print(i + " "); // Check if the value of // mid is equal to 0 if (mid == 0) break; } if (mid == 0) break; } } // Driver Code public static void main(String[] args) { int arr[] = { 10, 4, 2, 8, 9 }; int N = arr.length; findLarger(arr, N); } } // This code is contributed by sanjoy_62.
Python3
# Python program for the above approach # Function to find the element that # are larger than half of elements # of the array def findLarger(arr, n): # Find the value of mid mid = (n + 1) // 2 # Stores the maximum element mx = max(arr) # Stores the frequency of each # array element count = [0]*(mx + 1) for i in range(n): count[arr[i]] += 1 # Traverse the array in the # reverse order for i in range(mx,-1, -1): while (count[i] > 0): # Decrement the value # of count[i] and mid count[i] -= 1 mid -= 1 # Print current element print(i, end = " ") # Check if the value of # mid is equal to 0 if (mid == 0): break if (mid == 0): break # Driver Code if __name__ == '__main__': arr = [10, 4, 2, 8, 9 ] N = len(arr) findLarger(arr, N) # This code is contributed by mohit kumar 29.
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ // Function to find the element that // are larger than half of elements // of the array static void findLarger(int []arr, int n) { // Find the value of mid int mid = (n + 1) / 2; // Stores the maximum element int mx = Int32.MinValue; for(int i=0;i<n;i++){ if(arr[i]>mx) mx = arr[i]; } // Stores the frequency of each // array element int []count = new int[mx + 1]; Array.Clear(count,0,mx+1); for (int i = 0; i < n; i++) { count[arr[i]]++; } // Traverse the array in the // reverse order for (int i = mx; i >= 0; i--) { while (count[i] > 0) { // Decrement the value // of count[i] and mid count[i]--; mid--; // Print the current element Console.Write(i+" "); // Check if the value of // mid is equal to 0 if (mid == 0) break; } if (mid == 0) break; } } // Driver Code public static void Main() { int []arr = { 10, 4, 2, 8, 9 }; int N = arr.Length; findLarger(arr, N); } } // This code is contributed by SURENDRA_GANGWAR.
Javascript
<script> // JavaScript program for the above approach // Function to find the element that // are larger than half of elements // of the array function findLarger(arr, n) { // Find the value of mid let mid = (n + 1) / 2; // Stores the maximum element let mx = Math.max.apply(null, arr) // Stores the frequency of each // array element var count = new Array(mx + 1).fill(0); for (let i = 0; i < n; i++) { count[arr[i]]++; } // Traverse the array in the // reverse order for (let i = mx; i >= 0; i--) { while (count[i] > 0) { // Decrement the value // of count[i] and mid count[i]--; mid--; // Print the current element document.write(i + ' '); // Check if the value of // mid is equal to 0 if (mid == 0) break; } if (mid == 0) break; } } // Driver Code var arr = [10, 4, 2, 8, 9]; var N = 5; findLarger(arr, N); </script>
10 9 8
Complejidad de Tiempo: O(M), donde M es el elemento máximo del arreglo , arr[]
Espacio Auxiliar: O(M)
Publicación traducida automáticamente
Artículo escrito por srivastavaharshit848 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA