/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param number int整型
* @return int整型
*/
/**
* 解法一:递归(超时)
* 思路:满足斐波那契数列公式,最简单的肯定是递归
* 时间复杂度:O(2^n),每个递归会调用两个递归,因此会成二的指数级增长
* 空间复杂度:
*/
export function jumpFloor(number: number): number {
if (number <= 1) return 1
return jumpFloor(number - 1) + jumpFloor(number - 2)
}
/**
* 解法二:循环(记忆化累加)
* 思路:n1、n2 记录前面两位的结果,一个循环搞定
* 时间复杂度:O(n)
* 空间复杂度:O(1)
*/
export function jumpFloor(number: number): number {
if (number <= 2) return number
let n1 = 1 // 记录 n - 1 的结果
let n2 = 1 // 记录 n - 2 的结果
let res = 0
for (let i = 2; i <= number; i++) {
res = n1 + n2
// 记录中间结果
n2 = n1
n1 = res
}
return res
}
/**
* 解法三:动态规划
* 思路:
* 时间复杂度:O(n)
* 空间复杂度:
*/
export function jumpFloor(number: number): number {
const dp = new Array(number + 1)
dp[1] = 1
dp[2] = 2
for (let i = 3; i <= number; i++){
dp[i] = dp[i - 1] + dp[i - 2]
}
return dp[number]
}
一站式解决前端面试高频算法题