letcode63. 不同路徑 I和II

不同路徑Ⅰ和Ⅱ,這兩題做法差不多,就直接記錄在一起了。


就是兩道基礎DP,據說面試DP考的挺多的,特意來找找感覺。
這兩題都很基礎很簡單。

首先第一題不同路徑Ⅰ

  • ①dp[i][j]表示走到gicd[i][j]這裏的總路徑數。
  • ②因爲每個格子只能由上面的格子或者左邊的格子移過來。所以可以很容易寫下這樣的式子dp[i][j] = dp[i-1][j] + dp[i][j-1];
  • ③初始化考慮上面的式子i和j不能等於0,於是就想到了最上面一行和最左邊一列需要初始化。

接下來擼代碼就好了

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n));//正在剛c++primer剛學到的,不得不試一下
        for(int i=0; i<m; ++i) dp[i][0] = 1;//初始化
        for(int i=0; i<n; ++i) dp[0][i] = 1;//
        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++)
              dp[i][j] = dp[i-1][j]+dp[i][j-1];
        }
        return dp[m-1][n-1];
    }
};

接下來第二題,跟上題幾乎一毛一樣,思路不累贅了。
直接擼代碼

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

這裏得用long不然會爆int,奇怪了上題int都沒問題,數據範圍給的一樣,照理說下面這題應該更小纔對,letcode數據確實有點水。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章