/*
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。
問總共有多少條不同的路徑?
*/
思路:
從起點 (x=0,y=0)(x=0,y=0)(x=0,y=0) 出發,下一步只能向右或者向下到達第二點,向右則爲 (x+1,y)(x+1,y)(x+1,y) 向下則爲 (x,y+1)(x,y+1)(x,y+1),一直到 (x=m,y=n)(x=m,y=n)(x=m,y=n) 這個點則爲結束點視爲一條路徑。
因此從起點到終點的所有路徑總數則爲 222 個 以第二個點到終點的路徑數的總和。
//static int ve[101][101] = {0}; //0s
vector<vector<int>> ve(101,vector<int>(101,0)); //4s
class Solution {
public:
int uniquePaths(int m, int n) {
if(m == 1 || n == 1)
return 1;
if(m == 2 && n == 2)
return 2;
if(m == 2 && n == 3 || m == 3 && n == 2)
return 3;
if(ve[m][n] > 0)
return ve[m][n];
ve[m-1][n] = uniquePaths(m-1,n);
ve[m][n-1] = uniquePaths(m,n-1);
ve[m][n] = ve[m-1][n] + ve[m][n-1];
return ve[m][n];
}
};
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。
現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int R = obstacleGrid.size();
int C = obstacleGrid[0].size();
//obstacleGrid數組存儲的是到達這一位置的路徑數
//如果第一個節點處的值就爲1,那機器人一步也走不了
if(obstacleGrid[0][0] == 1)
return 0;
obstacleGrid[0][0] = 1;
//從0,0 出發先看最邊上的這一列是否有障礙物,並且計算到邊上的某一點的路徑
for(int i=1; i<R; i++)
{ //說明它的上一個節點不是障礙物
obstacleGrid[i][0] = (obstacleGrid[i][0] == 0 && obstacleGrid[i-1][0] == 1) ? 1 : 0;
}
for(int i=1; i<C; i++)
{
obstacleGrid[0][i] = (obstacleGrid[0][i] == 0 && obstacleGrid[0][i-1] == 1) ? 1: 0;
}
for(int i=1; i < R; i++)
{
for(int j=1; j < C; j++)
{
if(obstacleGrid[i][j] == 0)
{
obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1];
}
else
obstacleGrid[i][j] = 0;
}
}
return obstacleGrid[R-1][C-1];
}
};
複雜度分析
時間複雜度 : O(M×N)O(M \times N)O(M×N) 。長方形網格的大小是 M×NM \times NM×N,而訪問每個格點恰好一次。
空間複雜度 : O(1)O(1)O(1)。我們利用 obstacleGrid 作爲 DP 數組,因此不需要額外的空間。