跳台阶:最直观的想法是,经典斐波拉契数列变形,递推公式为f(n)=f(n-1)+f(n-2)。接下来分别使用四种方法实现:递归、记忆化搜索、动态规划、滚动数组。其整体思路为:跳一级台阶一种跳法,跳两级台阶两种跳法,跳n级台阶可以是n-1级台阶再跳一级或者是n-2级台阶再跳两级。
int jumpFloor(int number) { // 跳一级台阶一种跳法 if(number==1) return 1; // 跳两级台阶两种跳法 if(number==2) return 2; // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级 return jumpFloor(number-1)+jumpFloor(number-2); }
// 1<=n<=40 int memo[45]={0}; int jumpFloor(int number) { // 跳一级台阶一种跳法 if(number==1) return 1; // 跳两级台阶两种跳法 if(number==2) return 2; // 避免重复计算 以空间换时间 if(memo[number]!=0) return memo[number]; // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级 return memo[number]=jumpFloor(number-1)+jumpFloor(number-2); }
int jumpFloor(int number) { vector<int> dp(number+1,0); // 跳一级台阶一种跳法 dp[1]=1; // 跳两级台阶两种跳法 dp[2]=2; // 递推公式dp[i]=dp[i-1]+dp[i-2] for(int i=3;i<=number;i++) // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级 dp[i]=dp[i-1]+dp[i-2]; return dp[number]; }
int jumpFloor(int number) { if(number==1) return 1; if(number==2) return 2; // 跳一级台阶一种跳法 int a=1; // 跳两级台阶两种跳法 int b=2; // 递推公式dp[i]=dp[i-1]+dp[i-2] int c; for(int i=3;i<=number;i++) { // 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级 c=a+b; a=b; b=c; } return c; }