Code & Func
2017-11-12

第46天。

今天的题目是Climbing Stairs:

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

首先,要到达第n个台阶,我们需要先到n-1或n-2台阶,只要到达n-1和n-2台阶处,我们就能够通过一步到达第n个台阶,这时可以写出这样的递推式:

1
climbStairs(n) = climbStairs(n-1) + climbStairs(n-2);
2
climbStairs(0) = climbStairs(1) = 1;

熟悉的话,可以一眼看出这是斐波那契数列.

这样的话,我们可以很容易写出:

1
int climbStairs(int n) {
2
if (n == 0 || n == 1) return 1;
3
return climbStairs(n-1) + climbStairs(n-2);
4
}

但是这样会出现超时的情况,我们可以用一个数组来记录整个斐波那契数列,然后返回适当的值即可:

1
int climbStairs(int n) {
2
vector<int> vec(n+1,1);
3
for(int i = 2;i <= n;i++) {
4
vec[i] = vec[i-1] + vec[i-2];
5
}
6
return vec[n];
7
}

这样的时间复杂度和空间复杂度都是O(n).

我们可以把空间复杂度降到O(1):

1
int climbStairs(int n) {
2
int a = 0,b = 1,t;
3
while(n--) {
4
t = a+b;
5
a = b;
6
b = t;
7
}
8
return b;
9
}
上一条动态