1. 动态规划实战:不同路径Ⅱ问题解析
1.1 问题背景与理解
这道题目是经典的不同路径问题的变种,在网格中添加了障碍物这一限制条件。给定一个m×n的网格,其中某些格子被标记为障碍物(用1表示),机器人每次只能向下或向右移动一步,要求计算从左上角到右下角的所有可能路径数。
在实际面试中,这类问题考察的是候选人对动态规划思想的理解和应用能力。我遇到过不少候选人一开始会尝试用回溯法解决,但当网格较大时(比如100×100),回溯法的时间复杂度会变得不可接受。
1.2 动态规划解法详解
我们使用二维数组dp来存储中间结果,其中dp[i][j]表示到达网格(i,j)的路径数。关键状态转移方程需要考虑三种情况:
- 当(i,j)是障碍物时:dp[i][j] = 0
- 当位于第一行或第一列时:只能从一个方向过来
- 其他情况:dp[i][j] = dp[i-1][j] + dp[i][j-1]
java复制class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
// 边界条件处理
if(m == 0 || n == 0) return 0;
if(obstacleGrid[0][0] == 1) return 0;
int[][] dp = new int[m][n];
dp[0][0] = 1;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(obstacleGrid[i][j] == 1) {
dp[i][j] = 0;
continue;
}
if(i == 0 && j == 0) continue;
if(i == 0) {
dp[i][j] = dp[i][j-1];
} else if(j == 0) {
dp[i][j] = dp[i-1][j];
