62.不同路径
dp[i][j]: 对于i*j的网格,从左上走到右下有dp[i][j]种路径。
递推公式: dp[i][j] = dp[i-1][j] + dp[i][j-1]
初始化:
dp[0][0->j-1] = 1
dp[0->i-1][j] = 1
public int UniquePaths(int m, int n) {
int[,] dp = new int[m, n];
for (int j = 0; j <= n - 1; j++)
{
dp[0, j] = 1;
}
for (int i = 0; i <= m - 1; i++)
{
dp[i, 0] = 1;
}
for (int i = 1; i <= m - 1; i++)
{
for (int j = 1; j <= n - 1; j++)
{
dp[i, j] = dp[i - 1, j] + dp[i, j - 1];
}
}
return dp[m-1, n-1];
}
- 时间复杂度O(m*n)
- 空间复杂度O(m*n)
63. 不同路径 II
dp[i][j]: 对于i*j的网格,从左上走到右下有dp[i][j]种路径。
递推公式:
dp[i][j] = dp[i-1][j] + dp[i][j-1] (obstacleGrid[i][j] == 0)
dp[i][j] = 0 (obstacleGrid[i][j] == 1)
初始化:
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
public int UniquePathsWithObstacles(int[][] obstacleGrid) {
int rows = obstacleGrid.Length;
int columns = obstacleGrid[0].Length;
int[,] dp = new int[rows, columns];
for (int i = 0; i < columns && obstacleGrid[0][i] == 0; i++)
{
dp[0, i] = 1;
}
for (int i = 0; i < rows && obstacleGrid[i][0] == 0; i++)
{
dp[i, 0] = 1;
}
for (int i = 1; i <= rows - 1; i++)
{
for (int j = 1; j <= columns - 1; j++)
{
if (obstacleGrid[i][j] == 1) continue;
dp[i, j] = dp[i - 1, j] + dp[i, j - 1];
}
}
return dp[rows - 1, columns - 1];
}
- 时间复杂度O(m*n)
- 空间复杂度O(m*n)