題目連結:
題目意譯:
你被給定一個索引值從 0 開始數(shù)且大小為 3 × 3 的整數(shù)矩陣 grid,代表著每一個格子的石頭數(shù)。整個 grid 包含恰好 9 顆石頭,而一個格子內可以有多顆石頭。
在一步之中,你可以把一顆石頭從其現(xiàn)在所在的格子移動到另一個共享其中一邊的格子。
回傳讓每一格子包含恰好一顆石頭最少所需的步數(shù)。
限制:
grid.length == grid[i].length == 3
0 ≦ grid[i][j] ≦ 9
grid 中數(shù)字總和等於 9。
範例測資:
範例 1:
輸入: grid = [[1,1,0],[1,1,1],[1,2,1]]
輸出: 3
解釋: 在每一個格子中放一顆時頭的其中一個可能的方式為:
1- 從格子 (2,1) 移動一顆石頭到格子 (2,2)。
2- 從格子 (2,2) 移動一顆石頭到格子 (1,2)。
3- 從格子 (1,2) 移動一顆石頭到格子 (0,2)。
總計花了 3 步來在每一格中放一顆石頭。
可以證明 3 是為每一格放一顆石頭最少所需的步數(shù)。
範例 2:
輸入: grid = [[1,3,0],[1,0,0],[1,0,3]]
輸出: 4
解釋: 在每一個格子中放一顆時頭的其中一個可能的方式為:
1- 從格子 (0,1) 移動一顆石頭到格子 (0,2)。
2- 從格子 (0,1) 移動一顆石頭到格子 (1,1)。
3- 從格子 (2,2) 移動一顆石頭到格子 (1,2)。
4- 從格子 (2,2) 移動一顆石頭到格子 (2,1)。
總計花了 4 步來在每一格中放一顆石頭。
可以證明 4 是為每一格放一顆石頭最少所需的步數(shù)。
解題思維:
令零顆石頭的格子有 X 個,而有多於一顆石頭的格子為 Y 個。則所有可能的石頭分配方式將會被 X ^ Y 作為上界所限制住(X ^ Y 甚至有多算。因為那 Y 個格子每一格各自可以被選擇的次數(shù)取決於石頭數(shù)且每一顆石頭都一樣)。而 X ^ Y 最大值為 5 ^ 4 = 1024。
因此我們可以直接窮舉出所有的分配方式並檢查每一種所需的步數(shù)取最小者即可。
而範例程式碼是用深度優(yōu)先搜尋(Depth First Search)掃過石頭太多的格子中每一顆石頭要跑去哪一個空格(因此我的寫法實際上比較像是 Y ^ X)。時間複雜度會是 O(Y × X ^ Y)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。