LeetCode-063-不同路徑II

Gogoing_刻苦驢發表於2020-12-12

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

image.png

網格中的障礙物和空位置分別用 1 和 0 來表示。

示例 1:

image.png

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

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

image.png

輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/unique-paths-ii

解題思路

和上一題不同路徑思路基本一致
但是多了障礙判斷
並且為了節省空間, 採用一維滾動陣列來代替二維陣列
dp[j] += dp[j - 1]相當於將[i - 1][j]的結果+= [i][j - 1]然後賦給[i][j]
因為矩陣中每個格子的路徑數只需要看上方或者左方
所以兩層迴圈時, 每次子迴圈時一維陣列中原有的值代表了該位置i, j的上方i - 1, j的路徑數
然後再加上一維陣列中元素的前一個元素的路徑, 代表了加上i, j - 1的路徑
最後返回一維陣列最後一個元素

程式碼

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        if (obstacleGrid[0][0] == 1) {
            return 0;
        }
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[] dp = new int[n];
        dp[0] = 1;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (obstacleGrid[i][j] == 1) {
                    dp[j] = 0;
                    continue;
                }
                if (j >= 1) {
                    // 相當於將[i - 1][j]的結果 += [i][j - 1]然後賦給[i][j]
                    // 滾動陣列
                    dp[j] += dp[j - 1];
                }
            }
        }
        return dp[n - 1];
    }
}

相關文章