一、知识点:
动态规划
二、文字分析:
这个问题可以使用动态规划来解决。我们可以创建一个与农场大小相同的二维数组dp,dp[i][j]表示从起点到达位置(i, j)的不同路径数目。
- 如果农场的起点位置有障碍物,直接返回0,因为无法到达终点。
- 初始化dp[0][0]为1,表示起点位置的路径数。
- 初始化第一列,如果有障碍物或者前一个位置路径数为0,则从当前位置开始后面的路径不可达,将dp[i][0]置为0。
- 初始化第一行,如果有障碍物或者前一个位置路径数为0,则从当前位置开始后面的路径不可达,将dp[0][j]置为0。
- 对于其他位置(i, j),如果当前位置有障碍物,则将dp[i][j]置为0;否则,将当前位置的路径数等于左边位置的路径数加上上面位置的路径数,即dp[i][j] = dp[i-1][j] + dp[i][j-1]。
- 返回dp[m-1][n-1],即从起点到终点的不同路径数目。
- 时间复杂度:假设农场的大小为m x n。初始化dp数组需要遍历整个农场,所以时间复杂度为O(m x n)。对于每个位置(i, j),计算dp[i][j]的路径数需要参考左边位置和上边位置的路径数,所以总共需要遍历农场中的每个位置,时间复杂度为O(m x n)。因此,整体时间复杂度为O(m x n)。
- 空间复杂度:除了输入的农场二维数组外,我们使用了一个与农场大小相同的二维数组dp来保存路径数,所以空间复杂度为O(m x n)。
三、编程语言:
java
四、正确代码:
import java.util.*; public class Solution { public int uniquePathsWithObstacles(int[][] cows) { int m = cows.length; int n = cows[0].length; // 如果起点有障碍物,直接返回0 if (cows[0][0] == 1) { return 0; } int[][] dp = new int[m][n]; dp[0][0] = 1; // 初始化第一列 for (int i = 1; i < m; i++) { if (cows[i][0] == 1 || dp[i-1][0] == 0) { dp[i][0] = 0; } else { dp[i][0] = 1; } } // 初始化第一行 for (int j = 1; j < n; j++) { if (cows[0][j] == 1 || dp[0][j-1] == 0) { dp[0][j] = 0; } else { dp[0][j] = 1; } } // 计算其他位置的路径数 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (cows[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]; } }