1. 程式人生 > >LeetCode 931. Minimum Falling Path Sum Java

LeetCode 931. Minimum Falling Path Sum Java

紅色 symbol 如果 技術 stat ria emoji gpa -s

72.Minimum Falling Path Sum(下降路徑最小和)

題目:

  給定一個方形整數數組 A,我們想要得到通過 A 下降路徑最小和。

下降路徑可以從第一行中的任何元素開始,並從每一行中選擇一個元素。在下一行選擇的元素和當前行所選元素最多相隔一列。

  示例:

  輸入:[[1,2,3],[4,5,6],[7,8,9]]
  輸出:12
  解釋:
  可能的下降路徑有:
    •   [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
    •   [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
    •   [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]

  和最小的下降路徑是 [1,4,7],所以答案是 12

思路:

  從第二行開始,上方下落路徑至多三條,左上,上,右上,如果是兩側只有兩條路徑。直接在上方數字中找到最小數值,加上本身數值,這就是到達該點的和最小的下降路徑。

  接下來一行一行向下,直到計算到最後一行,遍歷最後一行,找到最小值即可。

圖解:

  紅色是計算式,左上角是本來數組的值。

  技術分享圖片

代碼:

  

技術分享圖片
 1     public static int minFallingPathSum(int
[][] A) { 2 int min = 9999; 3 int len = A.length; 4 for(int i = 1;i<len;i++) 5 { 6 for(int j = 0;j<len;j++) 7 { 8 if(j==0) 9 { 10 A[i][j] = A[i][j] + Math.min(A[i-1][j], A[i-1][j+1]);
11 } 12 else if(j==len-1) 13 { 14 A[i][j] = A[i][j] + Math.min(A[i-1][j], A[i-1][j-1]); 15 } 16 else 17 { 18 A[i][j] = A[i][j] + Math.min(A[i-1][j], Math.min(A[i-1][j-1], A[i-1][j+1])); 19 } 20 } 21 } 22 for(int i = 0;i<len;i++) 23 { 24 if(min>A[len-1][i]) 25 min = A[len-1][i]; 26 } 27 return min; 28 }
View Code

LeetCode 931. Minimum Falling Path Sum Java