題目連結:
題目意譯:
給定你一個 n × n 網格 grid,當中我們可以放置一些 1 × 1 × 1 方塊,其與 x 、 y 、 z 軸對齊。
每個值 v = grid[i][j] 代表有一座高 v 個方塊的塔於位置 (i, j)。
我們將觀看這些方塊投影於 xy 、 yz 以及 zx 平面。
一個投影類似於影子,其映射我們的三維圖形到一個二維平面。因此我們看的是會是從這些方塊的正上方、正前方以及側面的「影子」。
回傳三個投影的總面積。
限制:
n == grid.length
n == grid[i].length
1 ≦ n <≦ 50
0 ≦ grid[i][j] ≦ 50
範例測資:
範例 1:
輸入: grid = [[1,2],[3,4]]
輸出: 17
解釋: 上圖即為三個投影(「影子」)該圖形所產生於每個與軸對齊的平面。
範例 2:
輸入: grid = [[2]]
輸出: 5
範例 3:
輸入: grid = [[1,0],[0,2]]
輸出: 8
範例 4:
輸入: grid = [[1,1,1],[1,0,1],[1,1,1]]
輸出: 14
範例 5:
輸入: grid = [[2,2,2],[2,1,2],[2,2,2]]
輸出: 21
解題思維:
假設 grid 的「列」(Row)對應的是 y 座標軸、「行」(Column)對應的是 x 座標軸。
先討論投影到 xy 平面,可以看到這等同於從方塊們的正上方看(可以搭配範例的圖解)。所以如果 grid[i][j] > 0 ,代表該位置 (i, j) 有塔,則將會投影出 1 × 1 方塊之面積大小。
接著是投影到 zx 平面,可以看到該投影每個 x 單位區間 j 內的 z 值即代表投影時該區間內最高的塔即為該 z 值,也就代表其為 grid[y][j](0 ≦ y < grid.length)中最大值。
同理,投影到 yz 平面,每個 y 單位區間 i 內的 z 值即為 grid[i][x](0 ≦ y < grid.length)中最大值。
因此掃過 grid,加總每一列的最大值、每一行的最大值、塔的數量(塔高度 > 0)即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。