LeetCode三則

AisaMaral發表於2024-04-19
63. 不同路徑 II
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。
機器人每次只能向下或者向右移動一步。
機器人試圖達到網格的右下角(在下圖中標記為 “Finish”)。
現在考慮網格中有障礙物。
那麼從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1 和 0 來表示。

說明:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 為 0 或 1

示例 1:
輸入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
輸出:2
解釋:3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:
輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1
LeetCode三則
public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        //int陣列的初值為0
        int[][] dp = new int[m][n];
        //起始行有障礙物,則後續均無法到達
        if (obstacleGrid[0][0] == 1||obstacleGrid[m-1][n-1] == 1)return 0;
        dp[0][0] = 1;
        //起始列有障礙物,則無法到達,直接返回0
        for(int i=1;i<m;i++){
            if(obstacleGrid[i][0] == 0)
                dp[i][0] = 1;
            else
                break;
        }
        //起始行有障礙物,則後續均無法到達
        for(int j=1;j<n;j++){
            if(obstacleGrid[0][j] == 0)
                dp[0][j] = 1;
            else
                break;
        }
        //因為dp的起始列行中無法達到的位置都為0
        //所以,若存在多個障礙無法到達終點,則終點也為0
        for(int i=1;i<m;i++)
            for(int j=1;j<n;j++){
                if(obstacleGrid[i][j] == 0)
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        return dp[m-1][n-1];
    }
}
Solution
120. 三角形最小路徑和
給定一個三角形 triangle ,找出自頂向下的最小路徑和。

每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
也就是說,如果正位於當前行的下標 i ,那麼下一步可以移動到下一行的下標 i 或 i + 1 。
LeetCode三則
class Solution {
    /**
     * @author XiSoil
     * @date 2024/04/19 09:48
     *執行分佈用時3ms,擊敗的83.45%Java使用者
     *消耗記憶體分佈43.14MB,擊敗的45.60%Java使用者
     **/
    public int minimumTotal(List<List<Integer>> triangle) {
        int n = triangle.size();
        int[][] dp = new int[n][n];
        dp[0][0] = triangle.get(0).get(0);
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                if (j == 0)
                    dp[i][j] = dp[i - 1][j] + triangle.get(i).get(j);
                else if (j == i)
                    dp[i][j] = dp[i - 1][j - 1] + triangle.get(i).get(j);
                else
                    dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle.get(i).get(j);
            }
        }
        int min = 10001;
        for (int i = 0; i < n; i++) {
            min = Math.min(min, dp[n - 1][i]);
        }
        return min;
    }
}
Solution
931. 下降路徑最小和
給你一個 n x n 的 方形 整數陣列 matrix ,請你找出並返回透過 matrix 的下降路徑 的 最小和 。
下降路徑 可以從第一行中的任何元素開始,
並從每一行中選擇一個元素。
在下一行選擇的元素和當前行所選元素最多相隔一列(即位於正下方或者沿對角線向左或者向右的第一個元素)。
具體來說,位置 (row, col) 的下一個元素應當是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
LeetCode三則
public class Solution {
    public int minFallingPathSum(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int min = Integer.MAX_VALUE;
        int[][] dp = new int[m][n];
        for(int i= 0; i<m;i++){
            dp[0][i] = matrix[0][i];
        }
        for(int i=1;i<m;i++)
            for (int j=0;j<n;j++){
                if(j==0)
                    dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j];
                else if(j==n-1)
                    dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j-1])+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];
                if (i == m-1)
                    min = Math.min(min,dp[m-1][j]);
            }
        return min;
    }
}
Solution

相關文章