Questão diária Leetcode - 55. Jogo de salto (entrevista clássica 150 perguntas)

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

55. Jogo de salto - LeetCode

descrição do tópico

Dado um array de inteiros não negativos  nums , você está inicialmente no  primeiro índice do array  .

Cada elemento na matriz representa o comprimento máximo que você pode pular naquela posição.

Determine se você pode alcançar o último subscrito .

exemplo

Exemplo 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

Exemplo 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

dica

  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] <= 105

2. Ideias para resolução de problemas

Ideia geral:

       Vamos analisar o tópico primeiro. Esse problema exige que julguemos se podemos alcançar o último subscrito com base nos dados armazenados no array. E cada elemento do array representa o comprimento máximo que podemos pular na posição atual, ou seja, o comprimento do salto pode ser menor que ele. Mas, na verdade, não importa, não precisamos produzir o processo de alcançar o último subscrito, mas apenas julgar se podemos alcançar o último subscrito . Então o problema se torna simples.

       Agora vamos pensar sobre isso, como posso saber se posso chegar ao último subscrito? Sabemos que cada posição em que estamos tem um comprimento máximo correspondente que podemos pular, então através desses comprimentos máximos podemos saber a posição mais distante que podemos alcançar quando estamos em cada posição. Ou seja, a posição atual i+nums[i]. Assim, podemos definir um site variável para armazenar o local mais distante. E o que precisamos julgar é se podemos alcançar o último subscrito . Isso pode usar a ideia do algoritmo guloso. Descobrimos a posição mais distante que cada posição pode alcançar por vez e, em seguida, pegamos a maior, não a posição mais distante que pode ser alcançada no geral.

       Depois de encontrar a posição mais distante, precisamos julgar se podemos pular para esta etapa, então precisamos percorrer a matriz e, em seguida, comparar o subscrito atual com a posição mais distante, desde que a posição atual i≤site( posição mais distante ) , significa que no final conseguiremos chegar a esta etapa . E uma vez que a situação de i>site ocorre, isso significa que a maior distância obtida até agora não é o último subscrito , então não podemos alcançar o último subscrito, então retorna false.

Etapas específicas:

① Defina o site variável que armazena o local mais distante

②Atravesse a matriz e julgue se a coordenada atual é maior que a posição mais distante, se sim, retorne false; caso contrário, atualize a posição mais distante atual até que toda a matriz seja percorrida.

③ Defina a função max para atualizar a posição mais distante.


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

[Complexidade de tempo: O(n) Complexidade de espaço: O(1)]

int max(int a,int b)
{
    return a>b?a:b;
}

bool canJump(int* nums, int numsSize){
    //贪心算法
    int site = 0;//用来记录最远的位置
    //遍历数组,找到整个数组中能够达到的最远位置并记录下来
    //然后将其与当前位置进行比较,只有当当前位置小于等于最远位置才有可能到达最后一个下标
    //一旦出现当前下标大于最远位置的情况,则代表无法到达最后一个下标。
    for (int i = 0; i < numsSize; i++) 
    {
        if (i > site) 
        {
            return false;
        }
        site = max(site, i + nums[i]);//不断更新所能到的最远位置
    }
    return true;
}

おすすめ

転載: blog.csdn.net/m0_59800431/article/details/131592518