1. 程式人生 > 其它 >Leetcode120. 三角形最小路徑和

Leetcode120. 三角形最小路徑和

Leetcode120. 三角形最小路徑和

題目描述

/**
     * 給定一個三角形 triangle ,找出自頂向下的最小路徑和。
     * <p>
     * 每一步只能移動到下一行中相鄰的結點上。
     * 相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
     * 也就是說,如果正位於當前行的下標 i ,那麼下一步可以移動到下一行的下標 i 或 i + 1 。
     */

思路分析

  1. 三角形最小路徑和,即從最頂層到最底層對各層元素累加求最小值
  2. 規定下一層元素可以走的位置只能是上一層同列的元素或前一列的元素
  3. 建立二維動態規劃陣列,依次生成每一層的所有路徑和
  4. 由題目很容易得出狀態轉移方程,但要注意動態規劃陣列的第一列和最後一列的位置元素生成與其他位置不同
  5. 第一列直接由上一層同列元素加當前位置元素生成,最後一列直接有(i - 1)行和列位置元素+當前位置元素生成
  6. 原始碼見下

原始碼及分析

/**
     * 動態規劃
     * @param triangle 三角形
     * @return 返回最小路徑
     */
    public int minimumTotal(List<List<Integer>> triangle) {
        //三角形的層數,即三角形有多高
        int n = triangle.size();
        //動態規劃陣列
        int[][] f = new int[n][n];
        //初始化動態規劃陣列的第一行
        f[0][0] = triangle.get(0).get(0);
        //使用迴圈動態的填充二維陣列
        for (int i = 1; i < n; i++) {
            //陣列的第一列只能是上一列相同位置的數 + 當前位置的數
            f[i][0] = f[i - 1][0] + triangle.get(i).get(0);
            //由狀態轉移方程生成其他位置的元素
            for (int j = 1; j < i; j++) {
                f[i][j] = Math.min(f[i - 1][j - 1], f[i - 1][j]) + triangle.get(i).get(j);
            }
            //陣列的最後一列(i - 1)位置行和列元素+當前位置的元素
            f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);
        }
        //遍歷陣列的最後一列記錄最小值並返回
        int min = f[n - 1][0];
        for (int i = 1; i < f[n - 1].length ; i++) {
            if (min > f[n - 1][i]){
                min = f[n - 1][i];
            }
        }
        return min;
    }