题解 | #挤奶路径# java
挤奶路径
https://www.nowcoder.com/practice/6ab56cedae0646e19fb64b8bdbad82a6
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param cows int整型二维数组 * @return int整型 */ public int uniquePathsWithObstacles (int[][] cows) { // write code here int n = cows.length; int m = cows[0].length; int[][] f = new int[n][m]; for (int i = 0; i < n; i++) { if (cows[i][0] == 0) f[i][0] = 1; else break; } for (int i = 0; i < m; i++) { if (cows[0][i] == 0) f[0][i] = 1; else break; } for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { if (cows[i][j] == 0) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } else { f[i][j] = 0; } } } return f[n - 1][m - 1]; } }
该代码使用的编程语言是Java。
该题主要表达了动态规划的思想。给定一个二维矩阵cows,其中0表示可通过的路径,1表示障碍物。需要计算从矩阵左上角到右下角的不同路径数量。每次只能向右或向下移动一步。
代码解释大纲:
- 创建一个二维数组f来保存路径数量。该数组的行数和列数与输入的二维数组cows相同。
- 初始化f数组的边界情况:对于第一行和第一列,如果当前位置为可通过的路径(0),则将f数组对应位置置为1,表示只有一条路径可以到达该位置。如果在第一行或第一列中遇到障碍物(1),则后续位置都无法到达,直接跳出循环。
- 从第二行第二列开始,使用动态规划的思想计算路径数量:如果当前位置为可通过的路径(0),则该位置的路径数量等于其上方位置和左侧位置的路径数量之和,即f[i][j] = f[i-1][j] + f[i][j-1]。如果当前位置为障碍物(1),则路径数量为0,即f[i][j] = 0。
- 返回f数组右下角元素的路径数量,即f[n-1][m-1],其中n为数组的行数,m为数组的列数。