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;
}