該題目為求解三維形體的表面積,主要是求解過程很清晰,數學問題!
題目描述:
在 N * N 的網格上,我們放置一些 1 * 1 * 1 的立方體。
每個值 v = grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。
請你傳回最終形體的表面積。
執行個體1
輸入:[[2]]
輸出:10
執行個體2
輸入:[[1,2],[3,4]]
輸出:34
分析:
執行個體1可知,當隻有一摞立方體時,其表面積可以直接由長方體面積公式求得,S=grid[i][j]*4+2,四個側面積加上下底面積即可!
執行個體2:
相鄰的兩個立方體會進行吸收,是以,相鄰的表面積應該是較高的部分,減去較低的部分的剩餘面積,我們需要進行分層計算。
對于這個執行個體,分析如下:
S橫:以行為機關,第一行和最後一行的面積直接相加,其餘相鄰部分由相鄰方塊的差的絕對值構成;
S縱:以列為機關,第一列和最後一列的面積直接相加,其餘相鄰部分同樣由相鄰方塊差的絕對值構成;
S底:隻要單元格内有方塊,就加上、下兩個底面積,S底+=2,(不管是幾個)
總面積則等于三塊面積相加總和,代碼如下:
1 class Solution {
2 public:
3 int surfaceArea(vector<vector<int>>& grid) {
4 if(grid.size()==1)
5 return grid[0][0]*4+2;
6 int N=grid.size();
7 int count=0;
8 //先計算橫向面積
9 for(int i=0;i<N;i++)
10 {
11 for(int j=0;j<N;j++)
12 {
13 if(i==0) //首行相加
14 count+=grid[i][j];
15 else{
16 count+=abs(grid[i][j]-grid[i-1][j]); //其餘等于差的絕對值
17 }
18 if(i==N-1) //尾行直接相加
19 count+=grid[i][j];
20 }
21 }
22 //cout<<"hengxiang is "<<count<<endl;
23 //再計算縱向面積
24 for(int j=0;j<N;j++)
25 {
26 for(int i=0;i<N;i++)
27 {
28 if(j==0) //首列直接相加
29 count+=grid[i][j];
30 else{
31 count+=abs(grid[i][j]-grid[i][j-1]); //其餘等于差的絕對值
32 }
33 if(j==N-1) //尾列直接相加
34 count+=grid[i][j];
35 }
36 }
37 //計算上下面積
38 int sum=0;
39 for(int i=0;i<N;i++)
40 {
41 for(int j=0;j<N;j++)
42 {
43 if(grid[i][j]>0)
44 sum++;
45 }
46 }
47 //cout<<"sum is "<<sum<<endl;
48 count+=(sum*2); //上下兩個底面積,加到結果上
49
50 return count;
51 }
52 };
簡單題而已,清晰的程式設計思路很重要~~~