leetcode 70. Climbing Stairs
Easy
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、2组成的不同排列的数量(所有的1、2加起来等于n)
-
思考:
采取归纳的方法求解
设n的排列数为 S n S_n Sn
假设已知 S n S_n Sn 和 S n − 1 S_{n-1} Sn−1
考虑 S n + 1 S_{n+1} Sn+1,对其串进行分类,最右边为1的串的数量即为 S n S_n Sn, 最右边为2的串的数量即为 S n − 1 S_{n-1} Sn−1
故 S n + 1 S_{n+1} Sn+1= S n S_n Sn+ S n − 1 S_{n-1} Sn−1
采取函数递归的方式十分浪费资源和时间.
故选择从小到大推导
代码:
class Solution {
public:
int climbStairs(int n) {
if(n <= 3)
return n;
int a = 2, b = 3, i = 3;
int temp = 0;
while(i < n)
{
temp = b;
b = a+b;
a = temp;
i++;
}
return b;
}
};
leetcode显示的运行结果不太好:
Runtime: 4 ms, faster than 51.88% of C++ online submissions for Climbing Stairs.
Memory Usage: 8.3 MB, less than 89.71% of C++ online submissions for Climbing Stairs.
查看到的速度最快的代码是这样的:
class Solution {
public:
int climbStairs(int n) {
if (n <= 0) return 0;
if (n == 1 ) return 1;
if (n == 2) return 2;
vector<int> ways(n+1);
ways[0] = 0;
ways[1] = 1;
ways[2] = 2;
for (int i = 3; i < ways.size(); i++) {
ways[i] = ways[i-1] + ways[i-2];
}
return ways[n];
}
};