1 回答
TA贡献1825条经验 获得超6个赞
对于不需要递归的“更好”实现,请从右下方开始。
如果你这样做,你只需要记住一行(或一列),所以它既更快又需要更少的内存。
例子
让我们使用这样的网格。为了不与下面的路径计数数组混淆,使用符号而不是数字来定义网格。
. . . . .
. * * . .
. . . . .
. . . . .
现在为最后一行构建一个数组,其中有多少种方法可以从那里退出。
. . . . . last row from grid
=========
1 1 1 1 1 pathCount from each cell to the end
对其上方的行重复该操作。从右开始计算,pathCount为向右走时的pathCount + 向下走时的pathCount。
. . . . . 3rd row from grid
1 1 1 1 1 result from last row
=========
5 4 3 2 1 result for 3rd row
因为完成后我们不再需要最后一行的值,所以我们可以重用数组并替换内联值。
再重复一次。这次我们屏蔽了单元格,因此将这些单元格的 pathCount 设置为 0。
. * * . . 2nd row from grid
5 4 3 2 1 result from 3rd row
=========
5 0 0 3 1 result for 2nd row
最后:
. . . . . 1st row from grid
5 0 0 3 1 result from 2nd row
=========
9 4 4 4 1 result for 1st row
最终结果:从左上角到右下角的 9 条独特路径。
使用网格的替代格式的紧凑实现,以便于测试:
static int countPaths(String... grid) {
int[] paths = new int[grid[0].length() + 1];
paths[grid[0].length() - 1] = 1;
for (int y = grid.length - 1; y >= 0; y--)
for (int x = grid[0].length() - 1; x >= 0; x--)
paths[x] = (grid[y].charAt(x) != '0' ? 0 : paths[x] + paths[x + 1]);
return paths[0];
}
测试
System.out.println(countPaths("00000",
"01100",
"00000",
"00000")); // prints: 9
System.out.println(countPaths("000",
"000",
"000")); // prints: 6
添加回答
举报