Questão diária Leetcode - 45. Jumping game II (entrevista clássica 150 perguntas)

1. Descrição e requisitos do tópico

45. Jumping Game II - LeetCode

descrição do tópico

Dado um array inteiro indexado por zero nums de comprimento n. A posição inicial é nums[0] .

Cada elemento nums[i] representa o comprimento máximo para avançar do índice i. Em outras palavras, se você estiver em nums[i], poderá pular para qualquer nums[i + j]:   0 <= j <= nums[i] i + j < n

Retorna o número mínimo de saltos para atingir nums[n - 1] . Os casos de teste gerados podem atingir nums[n - 1].

exemplo

Exemplo 1:

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

Exemplo 2:

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

dica

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • O assunto é garantido para ser alcançável nums[n-1]

2. Ideias para resolução de problemas

Ideia geral:

       Vamos analisar o tópico primeiro. O Jumping Game II é um pouco mais complicado do que o Jumping Game. O Jumping Game só precisa julgar se podemos alcançar o último subscrito pulando, enquanto o Jumping Game II exige que calculemos o mínimo necessário para pular para o último subscrito Número de saltos. Nesse sentido, ainda podemos usar a ideia de um algoritmo guloso. Descobrimos a posição mais distante que cada subscrito pode alcançar, para encontrar o subscrito cuja posição mais distante é o último subscrito e, então, determinar quando pule e, ao mesmo tempo, conte o número de saltos. Esta é uma concepção do todo. A partir do conceito geral, podemos ver que precisamos resolver dois problemas, um é como julgamos se chegamos ao último subscrito e o outro é como contamos o número de saltos. (Porque podemos ter vários esquemas de salto em cada subscrito)

      Em primeiro lugar, como julgar se o último subscrito foi atingido ou não. Primeiro, o título nos diz que "é garantido que o título alcance nums[n-1]", então não precisamos julgá-lo, mas apenas precisa calcular para obter a posição mais distante como nunsSize -1 . Portanto, podemos usar o método de loop for para percorrer todo o array, calcular o valor de i+nums[i] (a posição mais distante que o subscrito atual pode alcançar) e compará-lo com a posição mais distante atual e tomar a comparação grande valor. Com este cálculo contínuo, podemos fazer site=numsSize-1. Isso resolve o primeiro problema. [Encontre a posição mais distante de cada intervalo e, finalmente, encontre o último subscrito]

       Então a segunda pergunta é como calculamos o número de saltos. Quando estivermos em um subscrito, obteremos um intervalo de salto, que é a posição mais distante do subscrito que pode ser alcançada a partir do próximo subscrito. Então, como julgamos quando pular, porque pode ser melhor para mim dar um passo, ou pode ser melhor dar dois passos O número de passos de salto não importa . Portanto, só precisamos saber quando ele deve pular uma vez.

       Então, quando temos que pular quando podemos escolher pular à vontade em um intervalo? É quando atingimos o limite desse intervalo, porque quando visitamos o limite desse intervalo, contamos a posição mais distante desse intervalo; portanto, definitivamente pularemos e continuaremos atualizando o limite até Alcançar o último subscrito . O limite inicial é definido como 0, porque temos que pular um passo do primeiro subscrito (não sabemos para qual subscrito saltamos), então atualizamos esse limite para o subscrito mais distante que obtivemos até agora e, em seguida, continuamos Encontre a posição mais distante que pode ser alcançada dentro desse intervalo [solução ótima local], porque não precisamos saber para qual subscrito saltamos, então usamos o limite de cada intervalo como condição para calcular o número de saltos . alcançamos O limite aumenta o número de vezes até que o último subscrito seja alcançado e, em seguida, termina , para que o número mínimo de vezes possa ser obtido.

       Na verdade, é um processo de expansão contínua do alcance até que o alcance seja expandido até o último subscrito.Neste processo, atingir o limite várias vezes significa pular várias vezes.

Etapas específicas:

① Defina o número mínimo de saltos numéricos, o final do limite do intervalo e a variável de local de posição mais distante

② Defina a função máxima para atualizar a posição mais distante

③ Atravesse a matriz para atualizar a posição mais distante e calcule o número de saltos

④ Retorne ao número de saltos


3. Código específico [linguagem 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;
}

Acho que você gosta

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