タイトル
グリッド上のN * N、我々はいくつかのキューブ* 1 * 1を入れました。
各値v =グリッド[i] [j]は、対応するセル(i、j)の上に重ねVキューブを表します。
最終体表面積に戻ってください。
例1:
入力:[[2]]
出力:10
例2:
入力:[1,2]、[3,4]
出力:34
実施例3:
入力:[1,0]、[0,2]
出力:16
実施例4:
入力:[[1,1,1]、[1,0,1]、[1,1,1]]
出力:32
実施例5:
入力:[[2,2,2]、[2,1,2]、[2,2,2]]
出力:46
ヒント:
1 <= N <= 50
0 <=グリッド[I] [J] <= 50
思考
最初のアイデアは簡単としてマークされているこのタイトルを追加することは比較的簡単です、4,5例(3次元図、左側面図と和の平面図の本体は、記事「中空」状態になるために2を掛けていることを前提とし正確に)下の面積を計算することはできません。だから、他の方法を考える:あなたは左から右へ、この三次元の体の上を歩くことを想像して、上から下へはそれが体の表面積で旅しました。次のことを達成するために:
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int N=grid.size();
if(N==0)
return 0;
int ispan=0, jspan=0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(j==0)
jspan+=grid[i][j];
else
jspan+=abs(grid[i][j]-grid[i][j-1]);
if(grid[i][j] != 0)
jspan+=1;
if(j == N-1)
jspan+=grid[i][j];
if(i == 0)
ispan+=grid[i][j];
else
ispan+=abs(grid[i][j]-grid[i-1][j]);
if(grid[i][j] != 0)
ispan+=1;//加了两次,正好对应上面和下面
if(i == N-1)
ispan+=grid[i][j];
}
}
return ispan+jspan;
}
};