算法题之Climbing Stairs(leetcode 70)
题目:
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?
Note: Given n will be a positive integer.
Approach #1 Brute Force [Time Limit Exceeded]
public class Solution { public int climbStairs(int n) { climb_Stairs(0, n); } public int climb_Stairs(int i, int n) { if (i > n) { return 0; } if (i == n) { return 1; } return climb_Stairs(i + 1, n) + climb_Stairs(i + 2, n); } }
Time complexity : O(2^n). Size of recursion tree will be 2^n.
Space complexity : O(n). The depth of the recursion tree can go upto n.
Approach #2 Recursion with memorization [Accepted]
public class Solution { public int climbStairs(int n) { int memo[] = new int[n + 1]; return climb_Stairs(0, n, memo); } public int climb_Stairs(int i, int n, int memo[]) { if (i > n) { return 0; } if (i == n) { return 1; } if (memo[i] > 0) { return memo[i]; } memo[i] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo); return memo[i]; } }
Time complexity : O(n). Size of recursion tree can go upto n.
Space complexity : O(n). The depth of recursion tree can go upto n.
Approach #3 Dynamic Programming [Accepted]
public class Solution { public int climbStairs(int n) { if (n == 1) { return 1; } int[] dp = new int[n + 1]; dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; } }
Time complexity : O(n). Single loop upto n.
Space complexity : O(n). dp array of size n is used.
Approach #4 Fibonacci Number [Accepted]:
public class Solution { public int climbStairs(int n) { if (n == 1) { return 1; } int first = 1; int second = 2; for (int i = 3; i <= n; i++) { int third = first + second; first = second; second = third; } return second; } }
Time complexity : O(n). Single loop upto n is required to calculate n^{th} fibonacci number.
Space complexity : O(1). Constant space is used.
原文:https://leetcode.com/articles/climbing-stairs/