leetcode - índice máximo de matriz de montaña

¡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.montañas.png

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;
    }
}
复制代码

Supongo que te gusta

Origin juejin.im/post/7083643267878748167
Recomendado
Clasificación