LeetCode(70)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?
분석은 다음과 같습니다.
여기 이 댓글이 잘 쓰여 있는 것을 보고 바로 붙였다.This is just Fibonacci numbers. The number of distinct ways for n steps are the sum of distinct ways for n-1 (because we can move 1 step first, then move the rest n - 1 steps) and distinct ways for n - 2 (because we can move 2 steps first, there are two ways to do it: move 1 steps twice and move 2 steps once, the former is a duplicate for the n - 1 case so we should eliminate).
코드는 다음과 같습니다.
class Solution {
public:
    int climbStairs(int n) {
        int a1=1;
        int a2=2;
        int sum=0;
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        for(int i=3;i<=n;i++){
            sum=a1+a2;
            a1=a2;
            a2=sum;
        }
        return sum;
    }
};

소결:
(1) 본 문제는 먼저 그림을 그려보고 문제의 본질이 피보나치 수열구통항 공식이라는 것을 알아야 한다.나는 먼저 귀속을 써서 제출 발견 시간을 초과했다.귀속이 교체보다 더 많은 시간과 공간 비용을 증가시킬 수 있음을 감안하여 귀속으로 바꾸면 절차가 통과된다.
2014-10-06 update: 
본질은 위와 같다. 단지 업데이트 후 수조 steps로 결과를 저장할 뿐, 위에서 a1, a2,sum를 번갈아 저장하는 방식보다 읽기 쉽다.
class Solution {
public:
    int climbStairs(int n) {
        int* steps = new int[n + 1];
        steps[1] = 1;
        steps[2] = 2;
        for (int i = 3; i <= n; ++i) {
            steps[i] = steps[i - 1] + steps[i - 2];
        }
        return steps[n];
    }
};

이 제목과 비교적 비슷하다.Leetcode (94) Unique Binary Search Trees

좋은 웹페이지 즐겨찾기