题目描述
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
Example 1:
Input: n = 3
Output: 3
Explanation:
1) 1, 1, 1
2) 1, 2
3) 2, 1
total 3.
Example 2:
Input: n = 1
Output: 1
Explanation:
only 1 way.
题解
考虑最后一步走1阶还是走2阶。
方案数Dp[n] = 最后一步走1阶的方案数 + 最后一步走2阶的方案数。
Dp[n] = Dp[n-1] + Dp[n-2].
对于大厂面试中高频出现的经典题,我们需要了解它的不同解法,有的大厂不喜欢你一上来就秒掉题目,而更重视你一步步根据题目优化解法,最后得到最优解的解题思路和过程。
另外即使运气真的很不好碰到了新题,做过的高频题也会激发你解题的思路。
public class Solution {
public int climbStairs(int n) {
if (n <= 1) {
return n;
}
int last = 1, lastlast = 1;
int now = 0;
for (int i = 2; i <= n; i++) {
now = last + lastlast;
lastlast = last;
last = now;
}
return now;
}
}
// 记忆化搜索
// 九章硅谷求职算法集训营版本
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
int[] result = null;
void f(int X) {
if (result[X] != -1) return;
if (X == 0 || X == 1) {
result[X] = 1;
return;
}
f(X - 1);
f(X - 2);
result[X] = result[X - 1] + result[X - 2];
}
public int climbStairs(int n) {
if (n == 0) {
return 0;
}
result = new int[n + 1];
for (int i = 0; i <= n; ++i) {
result[i] = -1;
}
f(n);
return result[n];
}
}