1 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
對(duì)于不需要遞歸的“更好”實(shí)現(xiàn),請(qǐng)從右下方開(kāi)始。
如果你這樣做,你只需要記住一行(或一列),所以它既更快又需要更少的內(nèi)存。
例子
讓我們使用這樣的網(wǎng)格。為了不與下面的路徑計(jì)數(shù)數(shù)組混淆,使用符號(hào)而不是數(shù)字來(lái)定義網(wǎng)格。
. . . . .
. * * . .
. . . . .
. . . . .
現(xiàn)在為最后一行構(gòu)建一個(gè)數(shù)組,其中有多少種方法可以從那里退出。
. . . . . last row from grid
=========
1 1 1 1 1 pathCount from each cell to the end
對(duì)其上方的行重復(fù)該操作。從右開(kāi)始計(jì)算,pathCount為向右走時(shí)的pathCount + 向下走時(shí)的pathCount。
. . . . . 3rd row from grid
1 1 1 1 1 result from last row
=========
5 4 3 2 1 result for 3rd row
因?yàn)橥瓿珊笪覀儾辉傩枰詈笠恍械闹担晕覀兛梢灾赜脭?shù)組并替換內(nèi)聯(lián)值。
再重復(fù)一次。這次我們屏蔽了單元格,因此將這些單元格的 pathCount 設(shè)置為 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
最終結(jié)果:從左上角到右下角的 9 條獨(dú)特路徑。
使用網(wǎng)格的替代格式的緊湊實(shí)現(xiàn),以便于測(cè)試:
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];
}
測(cè)試
System.out.println(countPaths("00000",
"01100",
"00000",
"00000")); // prints: 9
System.out.println(countPaths("000",
"000",
"000")); // prints: 6
添加回答
舉報(bào)