GuilinDev

Lc0931

05 August 2008

931. Minimum Falling Path Sum

n x n 矩阵中,从上到下的一条路径,路径和最小

二维DP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
    // dp[i][j]存储原数组i,j位置处能累加的最小下降和
    // dp[i][j] = matrix[i][j] + Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]),dp[i - 1][j + 1])
    public int minFallingPathSum(int[][] matrix) {
        if (matrix == null || matrix.length == 0) {
            return 0;
        }
        int len = matrix.length; // 是 n X n 的矩阵
        if (len == 1) { // 1 x 1的矩阵
            return matrix[0][0];
        }
        
        int[][] dp = new int[len][len];
        
        for (int j = 0; j < len; j++) { //第一行的各个值为初始化的值
            dp[0][j] = matrix[0][j];
        }
        
        for (int i = 1; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if (j == 0) {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j + 1]) + matrix[i][j];
                } else if (j == len - 1) {
                    dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + matrix[i][j];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i][j];
                }
            }
        }
                
        // 遍历最后一行,找到最小值
        return Arrays.stream(dp[len - 1]).min().getAsInt();
    }
}

上面的做法空间复杂度是O(n * n),如果额外用一个一维的滚动数组,空间复杂度为O(n);如果直接在原数组上修改,空间复杂度为O(1)

修改原数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int len = matrix.length;
        for(int i = 1; i < len; i++){
            for(int j = 0; j < len; j++){
                int oneRowMin;
                if(j == 0) {
                    oneRowMin = Math.min(matrix[i-1][j], matrix[i - 1][j + 1]);
                } else if (j == len - 1){
                    oneRowMin = Math.min(matrix[i-1][j], matrix[i - 1][j - 1]);
                } else {
                    oneRowMin = Math.min(Math.min(matrix[i - 1][j], matrix[i - 1][j - 1]), matrix[i - 1][j + 1]);
                }
                matrix[i][j] += oneRowMin;
            }
        }
        
        return Arrays.stream(matrix[len - 1]).min().getAsInt();
    }
}