[leetcode] 70. Climbing Stairs
题目链接:https://leetcode.com/problems/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?
思路
直接递归,三行代码就够了,但是会超时。所以我们需要用一个表来记录已经搜索过的路径数。
class Solution {
public:
int DFS(vector<int>& hash,int n){
if(hash[n] != -1)
return hahs[n];
int step1 = DFS(hash, n - 1);
if(hash[n - ] == -1)
hash[n - 1] = step1;
int step2 = DFS(hash, n - 2);
if(hash[n - 2] == -1)
hash[n - 2] =step2;
return step1 + step2;
}
int climbStairs(int n) {
vector<int> hash(n+1,-1);
hash[1] = 1;
hash[2] = 2;
return DFS(hash,n);
}
};
思路
基于动态规划的,其实这题就是斐波那契数列的变形,其状态转移方程为
hash[i] = hash[i-1] + hash[i-2];
class Solution {
public:
int climbStairs(int n) {
if(n < 1) return 0;
vector<int> hash(n+1,1);
for(int i =2;i <= n;i++)
hash[i] = hash[i-1] + hash[i-2];
return hash[n];
}
};