- 題目一:https://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358?tpId=46&tqId=29117&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
- 題目翻譯:
機器人位於m x n網格的左上角(在下圖中標記為“開始”)。 機器人只能在任何時間點向下或向右移動。 機器人試圖到達網格的右下角(在下圖中標記為“完成”)。 有多少個可能的唯一路徑? 上面是一個3×7的網格。 有多少個可能的唯一路徑? 注意:m和n最多為100。
- 思路:這道題目是一道典型的動態規划問題。從多個小問題的解的合並能夠解決最終原問題的解。得出的遞推式:res[i][j] = res[i-1][j] + res[i][j-1]; 初始化的時候將res二維數組的第一行第一列都置為1,方便計算。
- 代碼:
class Solution { public: int uniquePaths(int m, int n) { vector<vector<int>> res(m, vector<int>(n, 1));// 初始化二維數組 for (int i = 1; i<m ; i++) for (int j = 1; j<n; j++){ res[i][j] = res[i-1][j] + res[i][j-1]; } return res[m-1][n-1]; } };
- 題目二:https://www.nowcoder.com/practice/3cdf08dd4e974260921b712f0a5c8752?tpId=46&tqId=29116&tPage=4&rp=4&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
- 題目翻譯:
唯一路徑”的后續跟蹤: 現在考慮如果一些障礙物添加到網格。 有多少獨特的路徑會有? 障礙物和空白區域在網格中分別標記為1和0。 例如, 在3x3網格的中間有一個障礙物,如下所示。 [ [0,0,0], [0,1,0], [0,0,0] ]] 唯一路徑的總數為2。 注意:m和n最多為100。
- 思路:這道題其實是上面那個題目的衍生,方法肯定還是dp,但是要對出現障礙物的位置進行特殊處理。試想當只有一行的時候,某個障礙物出現,那么到達路徑為0.只有一列的時候也是一樣。所以首先初始化的時候對第一行第一列上面出現障礙物的地方將path[i][0] 和path[0][i]都置為0.然后我們還是利用上面的遞推式進行計算:res[i][j] = res[i-1][j] + res[i][j-1]。循環計算的時候如果碰到障礙物,就將path[i][j]置為0.這樣就解決了這個問題。
- 代碼:
class Solution { public: int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { int row = obstacleGrid.size(); int col = obstacleGrid[0].size(); vector<vector<int> > res(row, vector<int>(col, 0)); for (int i=0; i<col; i++){//處理列 res[0][i] = 1; if (obstacleGrid[0][i] == 1){ res[0][i] = 0; break; } } for (int i=0; i<row; i++){//處理列 res[i][0] = 1; if (obstacleGrid[i][0] == 1){ res[i][0] = 0; break; } } for (int i=1; i<row; i++){ for (int j=1; j<col; j++){ res[i][j] = res[i-1][j] + res[i][j-1]; if (obstacleGrid[i][j] == 1) res[i][j] = 0; } } return res[row-1][col-1]; } };