Pregunta diaria de Leetcode - 45. Juego de saltos II (entrevista clásica de 150 preguntas)

1. Descripción del tema y requisitos

45. Juego de saltos II - LeetCode

Tema Descripción

Dada una matriz de números enteros indexados a cero de longitud n. La posición inicial es nums[0] .

Cada elemento nums[i] representa la longitud máxima para saltar hacia adelante desde el índice i. En otras palabras, si está en nums[i], puede saltar a cualquier nums[i + j]:   0 <= j <= nums[i] i + j < n

Devuelve el número mínimo de saltos para llegar a nums[n - 1] . Los casos de prueba generados pueden alcanzar nums[n - 1].

ejemplo

Ejemplo 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

Ejemplo 2:

输入: nums = [2,3,0,1,4]
输出: 2

pista

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • Se garantiza que el sujeto sea accesible. nums[n-1]

2. Ideas para resolver problemas

Idea general:

       Analicemos el tema primero. Jumping Game II es un poco más complicado que Jumping Game. Jumping Game solo necesita juzgar si podemos alcanzar el último subíndice saltando, mientras que Jumping Game II requiere que calculemos el mínimo requerido para saltar al último. subíndice Número de saltos. En este sentido, todavía podemos usar la idea de un algoritmo voraz: averiguamos la posición más lejana que puede alcanzar cada subíndice, para encontrar el subíndice cuya posición más lejana es el último subíndice, y luego determinamos cuándo saltar, y al mismo tiempo contar el número de saltos. Esta es una concepción del todo. Desde el concepto general, podemos ver que necesitamos resolver dos problemas, uno es cómo juzgamos si hemos llegado al último subíndice y el otro es cómo contamos el número de saltos. (Porque podemos tener múltiples esquemas de salto en cada subíndice)

      En primer lugar, cómo juzgar si se alcanza o no el último subíndice. Primero, el título nos dice que "el título está garantizado para alcanzar nums[n-1]", por lo que no necesitamos juzgarlo, pero solo necesita calcular para obtener la posición más lejana como monjasSize -1 . Por lo tanto, podemos usar el método de bucle for para recorrer toda la matriz, calcular el valor de i+nums[i] (la posición más lejana que puede alcanzar el subíndice actual) a su vez, y compararlo con la posición más lejana actual, y tomar el gran valor de comparación. Con este cálculo continuo, podemos hacer site=numsSize-1. Esto resuelve el primer problema. [Encuentre la posición más lejana de cada rango y finalmente encuentre el último subíndice]

       Entonces la segunda pregunta es cómo calculamos el número de saltos. Cuando estamos en un subíndice, obtendremos un rango de salto, que es el subíndice de posición más lejano que se puede alcanzar desde el siguiente subíndice. Entonces, ¿cómo juzgamos cuándo saltar, porque puede ser mejor para mí dar un paso o puede ser mejor dar dos pasos ? El número de pasos de salto no importa . Entonces solo necesitamos saber cuándo debe saltar una vez.

       Entonces, ¿cuándo tenemos que saltar cuando podemos elegir saltar a voluntad en un rango? Es cuando alcanzamos el límite de este rango, porque cuando visitamos el límite de este rango, hemos contado la posición más lejana de este rango, por lo que definitivamente saltaremos y luego continuaremos actualizando el límite hasta Alcanzar el último subíndice . El límite inicial se establece en 0, porque tenemos que saltar un paso desde el primer subíndice (no sabemos a qué subíndice saltamos), luego actualizamos este límite al subíndice más lejano que hemos obtenido hasta ahora y luego continuamos Encuentre la posición más lejana que se puede alcanzar dentro de este rango [solución óptima local], porque no necesitamos saber a qué subíndice saltamos, por lo que usamos el límite de cada rango como condición para calcular el número de saltos . llegamos El límite aumenta el número de veces hasta que se alcanza el último subíndice, y luego termina , de modo que se puede obtener el número mínimo de veces.

       De hecho, es un proceso de expansión continua del rango hasta que el rango se expande hasta el último subíndice En este proceso, alcanzar el límite varias veces significa saltar varias veces.

Pasos específicos:

① Defina el número mínimo de saltos num, el final del límite del rango y la variable de sitio de posición más lejana

② Defina la función max para actualizar la posición más lejana

③ Atraviesa la matriz para actualizar la posición más lejana y calcular el número de saltos

④ Volver al número de saltos


3. Código específico [lenguaje C]

int max(int x,int y){
    return x>y?x:y;
}
int jump(int* nums, int numsSize){
    int num = 0;//达到nums[n-1]的最小跳跃次数
    int end = 0;//用来标志所能到达的最远边界
    int site=0;//能到达的最远位置
    for (int i = 0; i < numsSize-1; i++)
    {
        //通过遍历来找出每一个下标所能跳跃到的最远位置,取最远的
        site = max(site,i+nums[i]);
        //如果已经遍历到了所能到达的范围的边界,此时必须进行一次跳跃,同时更新所能到达的范围的边界
        if (i == end)
        {
            end = site;
            num++;
        }
    }
    return num;
}

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/131615851
Recomendado
Clasificación