1. 程式人生 > >LeetCode-70. Climbing Stairs (Java)

LeetCode-70. Climbing Stairs (Java)

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];      
    }