LeetCode-70. Climbing Stairs (Java)
阿新 • • 發佈:2019-02-16
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.
----------------------------------------------------------------------------------------------------------------------------------------------------------------題意
給定一個正整數,表示臺階,然後每一次你可以走一步或者兩步,可以由多少種不同的方式爬完樓梯。
思路
使用動態規劃的方法進行求解,那麼動態轉移方程是什麼呢?我們知道當只有1(n=1)個臺階時,只有一種方法即一步走一個臺階;當有兩個(n=2)臺階時,我們可以有兩種選擇:一次邁兩步,或者一次邁一步,邁兩次。那當臺階n>=3時,我們可以邁一步到達第n-2個臺階,然後邁兩步到達第n個臺階;或者,我們邁兩步到達第n-1個臺階,然後邁一步到達第n個臺階。那麼也就是說到達第n個臺階只和第n-1和第n-2有關。換句話說,到達第n個臺階有多少種不同的方式是到達第n-1個臺階的方式與到達第n-2個臺階的方式之和。
狀態轉移方程可以看做:steps[n] = steps[n-1]+steps[n-2];
狀態:step[i],表示到達第i個臺階的不同方式。
程式碼public static int climbStairs(int n) { //儲存單元只需兩個,ways[0]表示n-2階的走法,ways[1]表示n-1階走法數 int[] ways = {1, 1}; for (int i = 1; i < n; i++) { int temp = ways[1]; //狀態轉移方程的體現 step[i] = steps[i-2]+steps[i-1]; //ways[1] = ways[0]+ways[1]; ways[1] += ways[0]; ways[0] = temp; } return ways[1]; }