¡Acostúmbrate a escribir juntos! Este es el quinto día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .
Tema Descripción
Una matriz arr con las siguientes propiedades se denomina matriz de montañas:
- arr.longitud >= 3
- Existe i (0 < i < arr.length - 1) tal que:
-
- matriz[0] < matriz[1] < ... matriz[i-1] < matriz[i]
-
- arr[i] > arr[i+1] > ... > arr[arr.longitud - 1]
Dada una matriz de montaña arr de enteros, devolver cualquier valor que satisfaga arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr El subíndice i de [arr.length - 1].
Ejemplo 1:
Entrada: arr = [0,1,0]
Salida: 1
Ejemplo 2:
Entrada: arr = [0,2,1,0]
Salida: 1
Ejemplo 3:
Entrada: arr = [0,10,5,2]
Salida: 1
Ejemplo 4:
Entrada: arr = [3,4,5,1]
Salida: 1
Ejemplo 5:
Entrada: arr = [24,69,100,99,79,78,67,36,26,19]
Salida: 1
ideas
La matriz de montañas es bastante vívida. En resumen, hay un valor máximo único en la matriz. El valor máximo disminuye monótonamente hacia la izquierda y hacia la derecha, al igual que la forma de una montaña.
El método más intuitivo es recorrer desde la izquierda para encontrar el primer valor que satisfaga arr[k]>arr[k+1], entonces k es la solución que buscamos. La complejidad temporal de este método es O(len).
Pensando en el método anterior, en realidad hay una condición que no se utiliza por completo: después de que aparece el valor máximo, la matriz disminuye monótonamente.
Considerando la dicotomía, para arr[mid], hay 2 casos:
- arr[medio] > arr[medio+1]
Significa que mid es el valor del pico o el camino cuesta abajo detrás, puede usar el mid actual como alternativa y luego continuar dividiendo el lado izquierdo en dos puntos.
- arr[medio] < arr[medio+1]
Significa que el medio debe ser un camino cuesta arriba antes del pico, el pico debe estar a la derecha y continuar dividido en dos puntos a la derecha.
Código de la versión de Java
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int index = 0;
int left = 1, right = arr.length-2;
while (left <= right) {
int mid = left + ((right - left)>>1);
if (arr[mid] > arr[mid+1]) {
index = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return index;
}
}
复制代码