1. 题目
在N * N
的网格上,我们放置一些 1 * 1 * 1
的立方体。
每个值v = grid[i][j]
表示 v
个正方体叠放在对应单元格 (i, j)
上。
请你返回最终形体的表面积。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
2. 解题思路
哇,拿到这个题竟然半天没看懂题意。。。后来没办法看了别人的题解才明白这题是个啥意思,以第一个输入为例:function([[2]]) = 10
,意思是在grid[0][0]
这个坐标点上放置了grid[0][0] = 2
个边长为1
的立方体,所以因为两个立方体是重叠在一起的,那么表面积就是10
。
所以说,输入的是一个矩阵,矩阵的每一个值就是当前坐标点上放置的立方体的个数,是不是有种恍然大悟的赶脚~~。所以这道题可以这样做:先统计立方体的总个数count
,那么总面积就是count * 6
,然后减去立方体与立方体之间接触的面积,设接触的面为touch
,那么因为接触失去的面积就是touch * 2
,所以总面积就是count * 6 - touch * 2
;
2.1 代码
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
let [count, touch] = [0, 0]
for (let i=0; i < grid.length; i++) {
for (let j=0; j < grid[0].length; j++) {
count += grid[i][j]
touch += grid[i][j] ? grid[i][j] - 1 : 0 // 统计在竖直方向上的接触面
if (i > 0) touch += Math.min(grid[i][j], grid[i-1][j]) // 统计在当前柱子与左边柱子的接触面
if (j < grid[0].length - 1) touch += Math.min(grid[i][j], grid[i][j+1]) // 统计当前柱子与后面的柱子的接触面
}
}
return count * 6 - touch * 2
};
// 不需要统计前面 和 右边的接触数量是因为避免重复
2.2 图示
可能有的小伙伴不知道我所说的左边,后面是什么方向,故作此图: