Dada una array arr[] de N enteros distintos, la tarea es encontrar el elemento máximo en un intervalo [L, R] tal que el intervalo contenga exactamente uno de los N enteros dados y 1 ≤ L ≤ R ≤ 10 5
Entrada: arr[] = {5, 10, 200}
Salida: 99990
Todos los intervalos posibles son [1, 9], [6, 199] y [11, 100000].
[11, 100000] tiene los números enteros máximos, es decir, 99990.
Entrada: arr[] = {15000, 25000, 40000, 70000, 80000}
Salida: 44999
Enfoque: La idea es fijar el elemento que queremos que contenga nuestro intervalo. Ahora estamos interesados en cuánto podemos extender nuestro intervalo hacia la izquierda y hacia la derecha sin superponernos con otros elementos.
Entonces, primero ordenamos nuestra array. Luego, para un elemento fijo, determinamos sus extremos utilizando los elementos anterior y siguiente. También debemos cuidar los casos de esquina que son cuando arreglamos nuestro primer y último intervalo. De esta manera para cada elemento i, encontramos la longitud máxima del intervalo.
A continuación se muestra la implementación del enfoque anterior:
CPP
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the maximum // size of the required interval int maxSize(vector<int>& v, int n) { // Insert the borders for array v.push_back(0); v.push_back(100001); n += 2; // Sort the elements in ascending order sort(v.begin(), v.end()); // To store the maximum size int mx = 0; for (int i = 1; i < n - 1; i++) { // To store the range [L, R] such that // only v[i] lies within the range int L = v[i - 1] + 1; int R = v[i + 1] - 1; // Total integers in the range int cnt = R - L + 1; mx = max(mx, cnt); } return mx; } // Driver code int main() { vector<int> v = { 200, 10, 5 }; int n = v.size(); cout << maxSize(v, n); return 0; }
Java
// Java implementation of the approach import static java.lang.Integer.max; import java.util.*; class GFG { // Function to return the maximum // size of the required interval static int maxSize(Vector<Integer> v, int n) { // Insert the borders for array v.add(0); v.add(100001); n += 2; // Sort the elements in ascending order Collections.sort(v); // To store the maximum size int mx = 0; for (int i = 1; i < n - 1; i++) { // To store the range [L, R] such that // only v[i] lies within the range int L = v.get(i - 1) + 1; int R = v.get(i + 1) - 1; // Total integers in the range int cnt = R - L + 1; mx = max(mx, cnt); } return mx; } // Driver code public static void main(String[] args) { Integer arr[] = {200, 10, 5}; Vector v = new Vector(Arrays.asList(arr)); int n = v.size(); System.out.println(maxSize(v, n)); } } // This code is contributed by Princi Singh
Python
# Python3 implementation of the approach # Function to return the maximum # size of the required interval def maxSize(v, n): # Insert the borders for array v.append(0) v.append(100001) n += 2 # Sort the elements in ascending order v = sorted(v) # To store the maximum size mx = 0 for i in range(1, n - 1): # To store the range [L, R] such that # only v[i] lies within the range L = v[i - 1] + 1 R = v[i + 1] - 1 # Total integers in the range cnt = R - L + 1 mx = max(mx, cnt) return mx # Driver code v = [ 200, 10, 5] n = len(v) print(maxSize(v, n)) # This code is contributed by mohit kumar 29
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG { // Function to return the maximum // size of the required interval static int maxSize(List<int> v, int n) { // Insert the borders for array v.Add(0); v.Add(100001); n += 2; // Sort the elements in ascending order v.Sort(); // To store the maximum size int mx = 0; for (int i = 1; i < n - 1; i++) { // To store the range [L, R] such that // only v[i] lies within the range int L = v[i - 1] + 1; int R = v[i + 1] - 1; // Total integers in the range int cnt = R - L + 1; mx = Math.Max(mx, cnt); } return mx; } // Driver code public static void Main(String[] args) { int []arr = {200, 10, 5}; List<int> v = new List<int>(arr); int n = v.Count; Console.WriteLine(maxSize(v, n)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript implementation of the approach // Function to return the maximum // size of the required interval function maxSize(v, n) { // Insert the borders for array v.push(0); v.push(100001); n += 2; // Sort the elements in ascending order v.sort((a, b) => a - b); // To store the maximum size let mx = 0; for (let i = 1; i < n - 1; i++) { // To store the range [L, R] such that // only v[i] lies within the range let L = v[i - 1] + 1; let R = v[i + 1] - 1; // Total integers in the range let cnt = R - L + 1; mx = Math.max(mx, cnt); } return mx; } // Driver code let v = [ 200, 10, 5 ]; let n = v.length; document.write(maxSize(v, n)); </script>
99990
Complejidad de tiempo: O(nlog(n))
Espacio auxiliar: O(1)