思考:
- Unique Path 可以用動態規劃和排列組合解
- Unique Path II 可以用動態規劃
想法
- 1、對與問題一,排列組合考慮,要走到重點總共有n+m-2步,其中m-1步down和n-1步right,如果在m*n的方格內,選擇m-1個down,那麼剩下n-1步已經確定,並且唯一確定。所以問題一的解爲
Cn−1n+m−2 。動態規劃可以理解爲dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。當然,因爲只用到上一循環的結果,故可以用一維數組解。 - 2、問題二類似問題一的動態規劃解法。
代碼
問題一
解法一 排列組合
public class Solution {
public int uniquePaths(int m, int n) {
long path = 1;
long rem = 1;
int max = m > n? m: n;
for(int i = max; i < m + n - 1; i++){
path *= i;
rem *= (i - max + 1);
}
return (int)(path / rem);
}
}
解法二 動態規劃
public class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
for(int i = 0; i < n ; i++)
dp[i] = 1;
for(int i = 1; i < m; i++)
for(int j = 1; j < n; j++)
dp[j] = dp[j] + dp[j - 1];
return dp[n - 1];
}
}
問題二
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if(obstacleGrid.length < 1 || obstacleGrid[0].length < 1
|| obstacleGrid[0][0] == 1)
return 0;
int n = obstacleGrid.length;
int[] dp = new int[m];
dp[0] = 1;
for(int j = 1; j < m; j++)
dp[j] = obstacleGrid[0][j] == 0? dp[j - 1]: 0;
for(int i = 1; i < n; i++){
dp[0] = obstacleGrid[i][0] == 0? dp[0]: 0;
for(int j = 1; j < m; j++)
dp[j] = obstacleGrid[i][j] == 0? dp[j] + dp[j - 1]: 0;
}
return dp[m - 1];
}
}