LeetCode Online Judge 제목 C# 연습 - Climbing Stairs

5173 단어 LeetCode
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?
해법 1 - 귀속:
1         public static int ClimbStairsRecursive(int n)

2         {

3             if (n <= 2)

4                 return n;

5             return ClimbStairsRecursive(n - 2) + ClimbStairsRecursive(n - 1);

6         }

해법 2 - DP:
 1         public static int ClimbStairsDP(int n)

 2         {

 3             int[] s = { 0, 1, 2 };

 4             if(n <= 2)

 5                 return s[n];

 6 

 7             int num = 2;

 8 

 9             while (num++ < n)

10             {

11                 s[num % 3] = s[(num + 1) % 3] + s[(num + 2) % 3];

12             }

13 

14             return s[n % 3];

15         }

코드 분석:
이것은 사실 하나fibonacci 수열,k(n)=k(n-1)+k(n-2)이다.k(0) = 0; k(1) = 1; 물론 이 문제에서 k(2)=2(두 걸음의 계단은 두 가지 걸음걸이로 나눌 수 있다).
해법은 차례차례 쓰는 것이다.간단해!
해법 2는 DPdynamic programming를 사용하는데 공간의 복잡도를 낮추기 위해 나는 3개의 원소의 수조를 사용했다.만약 int[n]의 수조를 만들면 공간의 복잡도는 O(n)이고 현재는constant space입니다.DP의performance(효율)는 틀림없이 recursive보다 빨리 올 것이다. 왜냐하면 매번 귀속될 때마다stack을 새로 만들어야 하기 때문이다.다음은 서로 다른 해법을 테스트하는performace를 보겠습니다.
1             Stopwatch watch = new Stopwatch();

2             watch.Start();

3             for (int i = 0; i < 10; i++) 

4                 Console.WriteLine(ClimbStairsDP(30));

5                 //Console.WriteLine(ClimbStairsRecursive(30));

6             watch.Stop();

7             Console.WriteLine(watch.ElapsedMilliseconds);

나는 삽화를 하지 않고 모두에게 결과를 알려주겠다.내 기계에서 Recursive 사용 시간은 270ms 정도이고 DP 사용 시간은 0-1ms이다.

좋은 웹페이지 즐겨찾기