114. 不同的路徑、115. 不同的路徑 II(動態規劃)
阿新 • • 發佈:2018-12-26
解題思路
這是一道典型的動態規劃問題,使用一個二維陣列path記憶到達每一點可行的走法總數。首先將左邊界點和上邊界點初始化為1,因為機器人起始與(0,0),左邊界點和上邊界點的走法只有1種。接下來的每一點(i,j),可以由(i-1,j)向右走
或是(i,j-1)向下走來到達,因此在(i,j)這一點可到達的方法有path[i-1][j]+path[i][j-1]種,到達終點的方法則是path最後一個點的資料。有種遞迴的意思,不過這個是從終點向起點遞迴
程式碼:
不同的路徑二class Solution { public: /* * @param m: positive integer (1 <= m <= 100) * @param n: positive integer (1 <= n <= 100) * @return: An integer */ int uniquePaths(int m, int n) { // write your code here if(m==0||n==0) return 0; vector<vector<int>>path(m,vector<int>(n,0));//定義一個m*n的二維陣列,並初始化為0 for(int i=0;i<m;i++) path[i][0]=1; for(int j=0;j<n;j++) path[0][j]=1; for(int i=1;i<m;i++) for(int j=1;j<n;j++) path[i][j]=path[i-1][j]+path[i][j-1]; return path[m-1][n-1]; } };
"不同的路徑" 的跟進問題:
現在考慮網格中有障礙物,那樣將會有多少條不同的路徑?
網格中的障礙和空位置分別用 1 和 0 來表示。
樣例
如下所示在3x3的網格中有一個障礙物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有2條不同的路徑從左上角到右下角。
思想:此題比不同的路徑1稍微複雜,其中添加了障礙物,障礙物要分兩種情況考慮
1、障礙物在邊界上,假設障礙物在[0,1]則障礙物以及障礙物後的點[0,2],[0,3]........均不能用,即都要path值都要設為0;
2、障礙物在內部,則只是此障礙物不能用,需要在求path總數的迴圈中判斷,並將其path值設為0;
注意,內部障礙物點在求path總數的迴圈中一定要做判斷,不然會出錯。如例題,path[1][1]本應等於0,若不判斷則其等於path[0][1]+path[1][0]=2;
class Solution { public: /* * @param obstacleGrid: A list of lists of integers * @return: An integer */ int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) { // write your code here int m= obstacleGrid.size();//求二維陣列的行元素數 int n= obstacleGrid[0].size();//求二維陣列的列元素數 if(m==0||n==0) return 0; vector<vector<int>> path(m,vector<int>(n,0)); if(obstacleGrid[0][0]==1) return 0; path[0][0]=1; //解決邊界障礙物 for(int i=1;i<m;i++) { if (obstacleGrid[i][0]==1) path[i][0]==0; else path[i][0]=path[i-1][0]; } for(int j=1;j<n;j++) { if (obstacleGrid[0][j]==1) path[0][j]==0; else path[0][j]=path[0][j-1]; } //計算路徑總數 for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { if(obstacleGrid[i][j]==1)//解決內部障礙物 path[i][j]=0; else path[i][j]=path[i-1][j]+path[i][j-1]; } } return path[m-1][n-1]; } };