題目連結:
題目意譯:
給定一個索引值從 0 開始數且大小為 n × m 的二維整數矩陣 grid。我們定義一個索引值從 0 開始數且大小為 n × m 的二維矩陣 p 為 grid 的「乘積矩陣」,則其將滿足以下的條件:
每一個元素 p[i][j] 為 grid 中除了 grid[i][j] 以外的所有元素之乘積。此乘積值將會模 12345。
回傳 grid 的乘積矩陣。
限制:
1 ≦ n == grid.length ≦ 10 ^ 5
1 ≦ m == grid[i].length ≦ 10 ^ 5
2 ≦ n × m ≦ 10 ^ 5
1 ≦ grid[i][j] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: grid = [[1,2],[3,4]]
輸出: [[24,12],[8,6]]
解釋: p[0][0] = grid[0][1] × grid[1][0] × grid[1][1] = 2 × 3 × 4 = 24
p[0][1] = grid[0][0] × grid[1][0] × grid[1][1] = 1 × 3 × 4 = 12
p[1][0] = grid[0][0] × grid[0][1] × grid[1][1] = 1 × 2 × 4 = 8
p[1][1] = grid[0][0] × grid[0][1] × grid[1][0] = 1 × 2 × 3 = 6
所以答案為 [[24,12],[8,6]]。
範例 2:
輸入: grid = [[12345],[2],[1]]
輸出: [[2],[0],[0]]
解釋: p[0][0] = grid[0][1] × grid[0][2] = 2 × 1 = 2。
p[0][1] = grid[0][0] × grid[0][2] = 12345 × 1 = 12345。12345 % 12345 = 0。所以 p[0][1] = 0。
p[0][2] = grid[0][0] × grid[0][1] = 12345 × 2 = 24690。24690 % 12345 = 0。所以 p[0][2] = 0。
所以答案為 [[2],[0],[0]]。
解題思維:
首先我們把 grid 壓成一維,例如說每一列串接在前一列的結尾後面(不一定要這樣做,可以改成以行為準之類的),如 [[1,2],[3,4]] 會變成 [1,2,3,4] 等。
此時我們可以觀察到對於原本單一一個元素 grid[i][j] 要求的 p[i][j] 之值,在壓縮成一維後的新陣列會變成是 grid[i][j] 這個元素「左邊」的所有元素乘以「右邊」的所有元素。
因此可以仿照如
昨天的方式將「左」、「右」兩個方向分開求,然後按照類似前綴和(Prefix Sums,參見
這題;只是現在是前綴/後綴乘積)便可以求得每一個位置的 p[i][j] 值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。