[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 hash[n];
        int step1 = DFS(hash, n-1);
        if(hash[n-1] == -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) {
        vector<int> hash(n+1, -1); 
        hash[1] = 1;
        hash[2] = 2;
        for(int i = 3; i<= n; i++)
            hash[i] = hash[i-1] + hash[i-2]; 
        return hash[n];
    }
};



你可能感兴趣的:(LeetCode,算法,动态规划,DFS,深搜)