LetCode 브러시 문제: Climbing Stairs - Fibonacci 수열과 유사

1124 단어
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 climbStairs(int n) {
        if(n<=2)
            return n;
        
        int n1 = 1;
        int n2 = 2;
        int temp =3;
        int t;
        while(temp<=n)
        {
            t = n1 + n2;
            n1 = n2;
            n2 = t;
            temp++;
        }
        return n2;
    }
};

반복:
귀속 효율이 비교적 낮다. 나의 귀속 알고리즘은LetCode시스템에 받아들여지지 않았다. 이유는 n이 매우 크면 귀속이 너무 많다는 것이다.
개선된 방법은 모든 연산의 결과를 기록하는 것이다. 그러면 다음에 계산할 때 이미 값을 계산했다면 다시 한 번 계산할 필요가 없다.
향상된 알고리즘:
class Solution {
    unordered_map<int, int> res = {{1,1},{2,2},{3,3}};    // climbStairs  , 
public:
    int climbStairs(int n) {
        if(res.find(n) == res.end())
        {
            res[n] = climbStairs(n-1) + climbStairs(n-2);
        }
        return res[n];
    }
};

좋은 웹페이지 즐겨찾기