题目:
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2 Output: 2 Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: 3 Output: 3 Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step
题意很好理解,计算结果用递推式表示为:f(n) = f(n-1) + f(n-2) = 2f(n-2) + f(n-3) = 3f(n-3) + 2f(n-4) = ... 算法用递归实现代码如下:
class Solution {
public int climbStairs(int n) {
if(n <= 2) return n;
else return climbStairs(n-2) + climbStairs(n-1);
}
}
T(n) = 1,
若 n = 1 或 n = 2
T(n) = T(n-1) + T(n-2),
若n >= 3
计算f(n)的时间是f(n),当n很大时,计算f(n)的时间是指数级的。(n = 5时,f(n) = 8; n = 6 时,f(n) = 13;当n = 44时,结果为1134903170!!!)。
提交结果显示时间超限!
但如果将该递归算法改为迭代方式,只需要O(n)的时间复杂度和O(1)的空间复杂度。迭代方式实现代码如下:
class Solution {
public int climbStairs(int n) {
if(n <= 2) return n;
else {
int index = 3;
int preN_2 = 1, preN_1 = 2;
int ans = 0;
while(index <= n) {
ans = preN_1 + preN_2;
preN_2 = preN_1;
preN_1 = ans;
index ++;
}
return ans;
}
}
}
提交结果:AC