1. 程式人生 > >leetcode 63. 不同路徑 II(Unique Paths II)

leetcode 63. 不同路徑 II(Unique Paths II)

long 一個 com toc inf http tor ref 試圖

目錄

  • 題目描述:
  • 示例 1:
  • 解法:

題目描述:

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

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

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

技術分享圖片

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

說明:m 和 n 的值均不超過 100。

示例 1:

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

解法:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> obs = obstacleGrid;
        int m = obs.size();
        if(m == 0){
            return 0;
        }
        int n = obs[0].size();
        if(n == 0){
            return 0;
        }
        if(obs[0][0] == 1 || obs[m-1][n-1] == 1){
            return 0;
        }
        vector<long long> dp(n+1, 0);
        for(int i = 0; i < n; i++){ //initialize the dp vector
            if(obs[0][i] == 1){
                break;
            }else{
                dp[i+1] = 1;
            }
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j <= n; j++){
                if(obs[i][j-1] == 1){
                    dp[j] = 0;
                }else{
                    dp[j] += dp[j-1];
                }
            }
        }
        return dp.back();
    }
};

leetcode 63. 不同路徑 II(Unique Paths II)