力扣883.三維體投影面積
阿新 • • 發佈:2021-01-17
題目描述
在 N * N 的網格中,我們放置了一些與 x,y,z 三軸對齊的 1 * 1 * 1 立方體。每個值 v = grid[i][j] 表示 v 個正方體疊放在單元格 (i, j) 上。
現在,我們檢視這些立方體在 xy、yz 和 zx 平面上的投影。
投影就像影子,將三維形體對映到一個二維平面上。在這裡,從頂部、前面和側面看立方體時,我們會看到“影子”。
返回所有三個投影的總面積。
示例
示例 1: 輸入:[[2]] 輸出:5 示例 2: 輸入:[[1,2],[3,4]] 輸出:17 解釋: 這裡有該形體在三個軸對齊平面上的三個投影(“陰影部分”)。
示例 3:
輸入:[[1,0],[0,2]]
輸出:8
示例 4:
輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:14
示例 5:
輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:21
提示
1 <= grid.length = grid[0].length <= 50
0 <= grid[i][j] <= 50
解題思路
此題理解了投影的數學意義就好辦,所謂投影就是在某平面能投下的最大面積
所以在xoy平面的投影就是非零項的數量,我用了gridSize*(*gridColSize)-零項的數量來計算
在xoz平面的投影就是各個子陣列的最大值之和在yoz平面的投影就是各個子陣列相同位置的最大值之和
把三個平面面積相加即可
可改進:使用陣列存放最大值,就避免了兩次巢狀迴圈
程式碼
int projectionArea(int** grid, int gridSize, int* gridColSize){
int xyCount=gridSize*(*gridColSize);
int xzCount=0;
int yzCount=0;
for(int i=0;i<gridSize;i++){
int xMax=grid[i][0];
for(int j=0;j<*gridColSize; j++){
if(grid[i][j]==0)xyCount--;
if(grid[i][j]>xMax)xMax=grid[i][j];
}xzCount+=xMax;
}
for(int p=0;p<*gridColSize;p++){
int yMax=grid[0][p];
for(int q=0;q<gridSize;q++){
if(grid[q][p]>yMax)yMax=grid[q][p];
} yzCount+=yMax;
}return xyCount+xzCount+yzCount;
}