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?
解题思路:
动态规划DP(Dynamic Programming)入门题。
state: dp[i] 表示爬到第i个楼梯的所有方法的和
function: dp[i] = dp[i-1] + dp[i-2] //因为每次走一步或者两步, 所以f[i]的方法就是它一步前和两步前方法加和
initial: dp[0] = 0; dp[1] = 1
end : return f[n]
Java: Method 1: Time: O(n), Space: O(n)
public int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }
Java: Method 2: Time: O(n), Space: O(1)
public int climbStairs(int n) { if (n == 0 || n == 1 || n == 2){ return n; } int [] dp = new int[3]; dp[1] = 1; dp[2] = 2; for (int i =3; i <= n; i++) { dp[i%3] = dp[(i-1)%3] + dp[(i-2)%3]; } return dp[n%3]; }
Java: Method 3: Time: O(n), Space: O(1)
public class Solution { public int climbStairs(int n) { int[] dp = new int[]{0,1,2}; if(n < 3) return dp[n]; for(int i = 2; i < n; i++){ dp[0] = dp[1]; dp[1] = dp[2]; dp[2] = dp[0] + dp[1]; } return dp[2]; } }
Python:
class Solution: # DP Time: O(n) Space: O(1) def climbStairs(self, n): prev, current = 0, 1 for i in xrange(n): prev, current = current, prev + current, return current # Recursion Time: O(2^n) Space: O(n) def climbStairs1(self, n): if n == 1: return 1 if n == 2: return 2 return self.climbStairs(n - 1) + self.climbStairs(n - 2)