【分析题目】
一个小孩爬一个 n 层台阶的楼梯。他可以每次跳 1 步, 2 步 或者 3 步。实现一个方法来统计总共有多少种不同的方式爬到最顶层的台阶。
【解题思路】
【动态规划】
自己写的
public int climbStairs2(int n) {
if (n == 0)
return 1;
else if (n == 1)
return 1;
else if (n == 2)
return 2;
int[] f = new int[n + 1];
f[0] = 1;
f[1] = 1;
f[2] = 2;
for (int i = 3; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2] + f[i - 3];
}
return f[n];
}
感觉学到一个技能是:每次创建动态数组的时候扩展的时候,都得考虑和它有关的变量。
时间复杂度:o(logN)
官方
int[] f = new int[n+1];
f[0] = 1;
for (int i = 0; i <= n; i++)
for (int j = 1; j <= 3; j++) {
if (i >= j) {
f[i] += f[i-j];
}
}
return f[n];
}
【总结】
优化代码是必要的