leetcode-Climbing Stairs

本題的解法類似於斐波那契數列

記憶化搜索解法:

import java.util.Arrays;

/**
 * Created by liuyubobobo.
 */
public class Solution1 {

    private int[] memo;

    public int climbStairs(int n) {
        memo = new int[n+1];
        Arrays.fill(memo, -1);
        return calcWays(n);
    }

    private int calcWays(int n){

        if(n == 0 || n == 1)
            return 1;

        if(memo[n] == -1)
            memo[n] = calcWays(n - 1) + calcWays(n - 2);

        return memo[n];
    }

    public static void main(String[] args) {

        System.out.println((new Solution1()).climbStairs(10));
    }

動態規劃解法:

/// 70. Climbing Stairs
/// https://leetcode.com/problems/climbing-stairs/description/
/// 動態規劃
/// 時間複雜度: O(n)
/// 空間複雜度: O(n)
public class Solution2 {

    public int climbStairs(int n) {

        int[] memo = new int[n + 1];
        memo[0] = 1;
        memo[1] = 1;
        for(int i = 2 ; i <= n ; i ++)
            memo[i] = memo[i - 1] + memo[i - 2];
        return memo[n];
    }

    public static void main(String[] args) {

        System.out.println((new Solution2()).climbStairs(10));
    }
}

對比倆種算法, 我們發現,記憶化搜索的解法更容易理解,原因在於他還是使用了遞歸結構,而動態規劃算法雖然理解稍難點,但寫起來簡潔,所以一般我們先通過使用記憶化搜索的思路去優化問題,再使用動態規劃來寫代碼。注意首先這個問題必須是可以使用遞歸的,那麼我們的解決思路就是 遞歸---》尋找重疊子問題----》記憶化搜索-----》動態規劃

相似問題:

1.  120 Triangle

2. 64Minimum Path Sum

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章