Aumentar
Descripción del Título
Una rana puede saltar un paso a la vez o hasta dos pasos a la vez. Encuentre el número total de métodos de salto para que la rana salte en un paso de n niveles (un orden diferente cuenta como resultados diferentes).
Límite de tiempo: 1 segundo Límite de espacio: 32768K Índice de calor: 475919
Puntos de conocimiento de esta pregunta: recursividad
solución:
Numero de pasos | 0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Método de salto | 0 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
Al ver la secuencia de este conjunto de números, podemos ver que en realidad es una secuencia de Fibonacci con 3 pasos, que es la suma de los dos primeros elementos.
Solución uno: método recursivo
function jumpFloor(number)
{
// write code here
if(number == 0) return 0;
if(number == 1) return 1;
if(number == 2) return 2;
return jumpFloor(number - 1) + jumpFloor(number -2);
}
Complejidad de tiempo: O (N ^ 2)
Complejidad espacial: O (N)
Solución 2: Método de matriz
Dado que la complejidad de tiempo del método recursivo es demasiado alta, también podríamos probar el método de matriz.
function jumpFloor(number)
{
var array = [];
array[0] = 0;
array[1] = 1;
array[2] = 2;
for(var i = 3; i <= number; i++){
array[i] = array[i - 1] + array[i - 2];
}
return array[number];
}
Complejidad de tiempo: O (N)
Complejidad espacial: O (N)
Solución dos: método variable
La matriz que definimos crea un gran espacio, por lo que usamos almacenamiento variable para optimizar el código.
function jumpFloor(number)
{
if(number == 0) return 0;
if(number == 1) return 1;
if(number == 2) return 2;
var one = 1;
var two = 2;
var sum = 0;
for(var i = 2;i < number; i++){
sum = two + one;
one = two;
two = sum;
}
return sum;
}
Complejidad de tiempo: O (N)
Complejidad espacial: O (1) (se crean cuatro objetos, que son constantes, por lo que se pueden ignorar)
Salto anormal
Descripción del Título
Una rana puede saltar un paso a la vez o hasta dos pasos a la vez. Encuentre el número total de métodos de salto para que la rana salte en un paso de n niveles (un orden diferente cuenta como resultados diferentes).
Límite de tiempo: 1 segundo Límite de espacio: 32768K Índice de calor: 475919
Puntos de conocimiento de esta pregunta: recursividad
Al resolver el problema, los resultados son los siguientes
Solución uno: pow
function jumpFloorII(number)
{
// write code here
if(number == 0) return 0;
return Math.pow(2, number-1);
}
Solución 2: operación de cambio
function jumpFloorII(number)
{
return 1<<(number-1);
}
Solución 3: operador de energía (**)
function jumpFloorII(number)
{
return 2 ** (number-1);
}