在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
题解:
1.N*N网格
2.1*1*1立方体
3.v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上
4.求表面积
示例 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 <= grid[i][j] <= 50
解题思路:
立方体放在一起的时候,相邻的立方体会掩盖2个单位的表面积。相邻包括:前后,左右,上下六个方向
-
计算全部表面积,减去相邻掩盖掉的面
-
减去上下方向,在(i,j)坐标上摞有v个立方体,被掩盖掉(v-1)*2个面
-
减去前后方向,在j轴上减去相邻两摞立方体最少个数*2个面
-
减去左右方向,在j轴上减去相邻两摞立方体最少个数*2个
C/C++题解:
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int surfaceNum=0;//记录面数
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[i].size(); j++) {
if (grid[i][j]!=0) {//遍历元素
surfaceNum+=grid[i][j]*6;//不考虑被遮盖的面总共有
surfaceNum-=(grid[i][j]-1)*2;}//减去上下方向遮盖的面*2
if (i>0)//如果有左右相邻立方体,减去左右方向遮盖的
surfaceNum-=min(grid[i-1][j], grid[i][j])*2;
if (j>0)//如果有前后相邻立方体,减去左右方向遮盖的
surfaceNum-=min(grid[i][j-1], grid[i][j])*2;}}
return surfaceNum;}};//返回所有没有被遮盖的
Debug结果:
Java题解:
class Solution {
public int surfaceArea(int[][] grid) {
int surfaceNum=0;//记录面数
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j]!=0) {//遍历元素
surfaceNum+=grid[i][j]*6;//不考虑被遮盖的面总共有
surfaceNum-=(grid[i][j]-1)*2;}//减去上下方向遮盖的面*2
if (i>0)//如果有左右相邻立方体,减去左右方向遮盖的
surfaceNum-=Math.min(grid[i-1][j], grid[i][j])*2;
if (j>0)//如果有前后相邻立方体,减去左右方向遮盖的
surfaceNum-=Math.min(grid[i][j-1], grid[i][j])*2;}}
return surfaceNum; }}//返回所有没有被遮盖的
Debug结果:
Python题解:
class Solution(object):
def surfaceArea(self, grid):
""":type grid: List[List[int]]:rtype: int"""
surfaceNum=0 #记录面数
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] != 0:#遍历元素
surfaceNum += grid[i][j]*6#不考虑被遮盖的面总共有
surfaceNum-=(grid[i][j]-1)*2#减去上下方向遮盖的面*2
if i>0:#如果有左右相邻立方体,减去左右方向遮盖的
surfaceNum-=min(grid[i-1][j], grid[i][j])*2
if j>0:#如果有前后相邻立方体,减去左右方向遮盖的
surfaceNum-=min(grid[i][j-1], grid[i][j])*2
return surfaceNum#返回所有没有被遮盖的
Debug结果:
例题来自力扣网https://leetcode-cn.com/
更多题解前往公众号获取