1. 程式人生 > 其它 >力扣883.三維體投影面積

力扣883.三維體投影面積

技術標籤:leetcodeleetcode演算法

題目描述

在 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; }

連結