Dada una array arr[] y una array Q[][] que consta de consultas de la forma {L, R} , la tarea de cada consulta es encontrar el elemento máximo de la array después de eliminar los elementos de la array del rango de índices [L , R] . Si la array se vacía después de eliminar los elementos del rango de índices dado, imprima 0 .
Ejemplos:
Entrada: arr[] = {5, 6, 8, 10, 15}, Q = {{0, 1}, {0, 2}, {1, 4}}
Salida:
15
15
5
Explicación:
Para la primera consulta {0 1}: elimine los elementos de la array en el rango [0, 1], la array se modifica a {8, 10, 15}. Por lo tanto, el elemento máximo es 15.
Para la segunda consulta {0, 2}: elimine los elementos de la array en el rango [0, 2], la array se modifica a {10, 15}. Por lo tanto, el elemento máximo es 15.
Para la tercera consulta {1 4}: elimine los elementos de la array en el rango [1, 4], la array se modifica a {5}. Por lo tanto, el elemento máximo es 5.Entrada: arr[] = {8, 12, 14, 10, 13}, Q = {{0, 3}, {0, 4}, {4, 4}}
Salida:
13
-1
14
Enfoque ingenuo: el enfoque más simple es recorrer la array para encontrar el elemento máximo después de eliminar los elementos de la array en el rango dado en cada consulta.
Complejidad temporal: O(N*Q)
Espacio auxiliar: O(1)
Enfoque eficiente: para optimizar el enfoque anterior, la idea es utilizar dos arrays auxiliares: una almacenará el prefijo máximo (elemento máximo en el rango [0, i] ) y la otra array almacenará el sufijo máximo (elemento máximo en el rango). rango [i, N – 1] ). Luego, para cada consulta [L, R] , la respuesta será un máximo de prefixMax[l – 1] y suffixMax[r + 1] . Siga los pasos a continuación para resolver el problema:
- Inicialice dos arrays auxiliares: prefixMax y suffixMax de tamaño N + 1 e inicialice prefixMax[0] como arr[0] y suffixMax[N – 1] como arr[N – 1] .
- Iterar sobre el rango [1, N – 1] usando la variable i y establecer prefixMax[i] al máximo de prefixMax[i – 1] y arr[i] .
- Iterar sobre el rango [N – 2, 0] usando la variable i y establecer suffixMax[i] al máximo de suffixMax[i + 1] y arr[i] .
- Recorra la array Q[][] y para cada consulta, verifique las siguientes condiciones:
- Si L = 0 y R = N – 1 , imprima 0 como resultado.
- De lo contrario, si L = 0 , imprima sufijoMax[R + 1] como resultado.
- De lo contrario, si R = N – 1 , imprime prefixMax[L – 1] como resultado.
- Para todos los demás casos, imprima el máximo de prefixMax[L – 1] y suffixMax[R + 1] .
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 maximum element // after removing elements in range [l, r] int findMaximum(int arr[], int N, int Q, int queries[][2]) { // Store prefix maximum element int prefix_max[N + 1] = { 0 }; // Store suffix maximum element int suffix_max[N + 1] = { 0 }; // Prefix max till first index // is first index itself prefix_max[0] = arr[0]; // Traverse the array to fill // prefix max array for (int i = 1; i < N; i++) { // Store maximum till index i prefix_max[i] = max(prefix_max[i - 1], arr[i]); } // Suffix max till last index // is last index itself suffix_max[N - 1] = arr[N - 1]; // Traverse the array to fill // suffix max array for (int i = N - 2; i >= 0; i--) { // Store maximum till index i suffix_max[i] = max(suffix_max[i + 1], arr[i]); } // Traverse all queries for (int i = 0; i < Q; i++) { // Store the starting and the // ending index of the query int l = queries[i][0]; int r = queries[i][1]; // Edge Cases if (l == 0 && r == (N - 1)) cout << "0\n"; else if (l == 0) cout << suffix_max[r + 1] << "\n"; else if (r == (N - 1)) cout << prefix_max[l - 1] << "\n"; // Otherwise else cout << max(prefix_max[l - 1], suffix_max[r + 1]) << "\n"; } } // Driver Code int main() { int arr[] = { 5, 6, 8, 10, 15 }; int N = sizeof(arr) / sizeof(arr[0]); int queries[][2] = { { 0, 1 }, { 0, 2 }, { 1, 4 } }; int Q = sizeof(queries) / sizeof(queries[0]); findMaximum(arr, N, Q, queries); return 0; }
Java
// Java program for the above approach class GFG { // Function to find the maximum element // after removing elements in range [l, r] static void findMaximum(int arr[], int N, int Q, int queries[][]) { // Store prefix maximum element int prefix_max[] = new int[N + 1]; // Store suffix maximum element int suffix_max[] = new int[N + 1]; // Prefix max till first index // is first index itself prefix_max[0] = arr[0]; // Traverse the array to fill // prefix max array for (int i = 1; i < N; i++) { // Store maximum till index i prefix_max[i] = Math.max(prefix_max[i - 1], arr[i]); } // Suffix max till last index // is last index itself suffix_max[N - 1] = arr[N - 1]; // Traverse the array to fill // suffix max array for (int i = N - 2; i >= 0; i--) { // Store maximum till index i suffix_max[i] = Math.max(suffix_max[i + 1], arr[i]); } // Traverse all queries for (int i = 0; i < Q; i++) { // Store the starting and the // ending index of the query int l = queries[i][0]; int r = queries[i][1]; // Edge Cases if (l == 0 && r == (N - 1)) System.out.print("0\n"); else if (l == 0) System.out.print(suffix_max[r + 1] + "\n"); else if (r == (N - 1)) System.out.print(prefix_max[l - 1] + "\n"); // Otherwise else System.out.print(Math.max(prefix_max[l - 1], suffix_max[r + 1]) + "\n"); } } // Driver Code public static void main(String[] args) { int arr[] = { 5, 6, 8, 10, 15 }; int N = arr.length; int queries[][] = { { 0, 1 }, { 0, 2 }, { 1, 4 } }; int Q = queries.length; findMaximum(arr, N, Q, queries); } } // This code is contributed by shikhasingrajput
Python3
# Python3 program for the above approach # Function to find the maximum element # after removing elements in range [l, r] def findMaximum(arr, N, Q, queries): # Store prefix maximum element prefix_max = [0]*(N + 1) # Store suffix maximum element suffix_max = [0]*(N + 1) # Prefix max till first index # is first index itself prefix_max[0] = arr[0] # Traverse the array to fill # prefix max array for i in range(1, N): # Store maximum till index i prefix_max[i]= max(prefix_max[i - 1], arr[i]) # Suffix max till last index # is last index itself suffix_max[N - 1] = arr[N - 1] # Traverse the array to fill # suffix max array for i in range(N - 2, -1, -1): # Store maximum till index i suffix_max[i] = max(suffix_max[i + 1], arr[i]) # Traverse all queries for i in range(Q): # Store the starting and the # ending index of the query l = queries[i][0] r = queries[i][1] # Edge Cases if (l == 0 and r == (N - 1)): print("0") elif (l == 0): print(suffix_max[r + 1]) elif (r == (N - 1)): print(prefix_max[l - 1]) # Otherwise else: print(max(prefix_max[l - 1], suffix_max[r + 1])) # Driver Code if __name__ == '__main__': arr = [5, 6, 8, 10, 15] N = len(arr) queries = [ [ 0, 1 ], [ 0, 2 ], [ 1, 4 ] ] Q = len(queries) findMaximum(arr, N, Q, queries) # This code is contributed by mohit kumar 29.
C#
// C# program for the above approach using System; public class GFG { // Function to find the maximum element // after removing elements in range [l, r] static void findMaximum(int[] arr, int N, int Q, int[,] queries) { // Store prefix maximum element int[] prefix_max = new int[N + 1]; // Store suffix maximum element int[] suffix_max = new int[N + 1]; // Prefix max till first index // is first index itself prefix_max[0] = arr[0]; // Traverse the array to fill // prefix max array for (int i = 1; i < N; i++) { // Store maximum till index i prefix_max[i] = Math.Max(prefix_max[i - 1], arr[i]); } // Suffix max till last index // is last index itself suffix_max[N - 1] = arr[N - 1]; // Traverse the array to fill // suffix max array for (int i = N - 2; i >= 0; i--) { // Store maximum till index i suffix_max[i] = Math.Max(suffix_max[i + 1], arr[i]); } // Traverse all queries for (int i = 0; i < Q; i++) { // Store the starting and the // ending index of the query int l = queries[i, 0]; int r = queries[i, 1]; // Edge Cases if (l == 0 && r == (N - 1)) Console.Write("0\n"); else if (l == 0) Console.Write(suffix_max[r + 1] + "\n"); else if (r == (N - 1)) Console.Write(prefix_max[l - 1] + "\n"); // Otherwise else Console.Write(Math.Max(prefix_max[l - 1], suffix_max[r + 1]) + "\n"); } } // Driver Code static public void Main () { int[] arr = { 5, 6, 8, 10, 15 }; int N = arr.Length; int[,] queries = { { 0, 1 }, { 0, 2 }, { 1, 4 } }; int Q = queries.GetLength(0); findMaximum(arr, N, Q, queries); } } // This code is contributed by sanjoy_62.
Javascript
<script> // JavaScript program of the above approach // Function to find the maximum element // after removing elements in range [l, r] function findMaximum(arr, N, Q, queries) { // Store prefix maximum element let prefix_max = []; // Store suffix maximum element let suffix_max = []; // Prefix max till first index // is first index itself prefix_max[0] = arr[0]; // Traverse the array to fill // prefix max array for (let i = 1; i < N; i++) { // Store maximum till index i prefix_max[i] = Math.max(prefix_max[i - 1], arr[i]); } // Suffix max till last index // is last index itself suffix_max[N - 1] = arr[N - 1]; // Traverse the array to fill // suffix max array for (let i = N - 2; i >= 0; i--) { // Store maximum till index i suffix_max[i] = Math.max(suffix_max[i + 1], arr[i]); } // Traverse all queries for (let i = 0; i < Q; i++) { // Store the starting and the // ending index of the query let l = queries[i][0]; let r = queries[i][1]; // Edge Cases if (l == 0 && r == (N - 1)) document.write("0"); else if (l == 0) document.write(suffix_max[r + 1] + "<br/>"); else if (r == (N - 1)) document.write(prefix_max[l - 1] + "<br/>"); // Otherwise else document.write(Math.max(prefix_max[l - 1], suffix_max[r + 1]) + "<br/>"); } } // Driver Code let arr = [ 5, 6, 8, 10, 15 ]; let N = arr.length; let queries = [[ 0, 1 ], [ 0, 2 ], [ 1, 4 ]]; let Q = queries.length; findMaximum(arr, N, Q, queries); // This code is contributed by avijitmondal1998. </script>
15 15 5
Complejidad temporal: O(N + Q)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por shubhampokhriyal2018 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA