算法-------三角形最小路徑和(Java版本)

題目

給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裏指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。

 

例如,給定三角形:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自頂向下的最小路徑和爲 11(即,2 + 3 + 5 + 1 = 11)。

解決方法

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {

//        return sum;
        //使用遞歸  對於最頂層的三星形  最大值爲頂角 加上 兩個孩子當中的最大值
        //每一個子孩子的最大值 又等於下面兩個孩子的最大值
        // fmax(A) = fmax(left) + fmax(right)
        //最小值也同理
        if (triangle == null || triangle.size() == 0) {
            return 0;
        }

        List<Integer> integers = triangle.get(0);
        if (integers == null || integers.size() == 0) {
            return 0;
        }
        int dp[][]  =new int[triangle.size()][triangle.get(triangle.size()-1).size()];
        return integers.get(0) + miniIndex(1,triangle,0,dp);
    }

    public int miniIndex(int floor,List<List<Integer>>  listList,int mCurIndex,int dp[][]){
        if (listList == null || floor >= listList.size()) {
            return 0;
        }
        if (dp[floor][mCurIndex] != 0) {
            return dp[floor][mCurIndex];
        }
        List<Integer> integers = listList.get(floor);
        int min = Math.min(integers.get(mCurIndex) + miniIndex(floor + 1, listList, mCurIndex, dp), integers.get(mCurIndex + 1) + miniIndex(floor + 1, listList, mCurIndex + 1, dp));
        dp[floor][mCurIndex] = min;
        return min;
    }    
}

總結:

學習動態規劃有一段時間了,終於會用動態規劃解決問題了。這道題沒有看題解,自己寫出來的,自豪,加油~

算法的學習,我是從不會做,看題解,思考學習,然後去思考解決同類型問題,慢慢學。一道題長時間想不到怎麼做,就不要耽誤太長時間,像面試一樣,不然根本做不到一天一道題的量,然後對自己學習也沒有什麼好處。

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