题目地址:https://leetcode-cn.com/problems/to-lower-case/submissions/
代码语言:javascript复制给你一个 n n 的网格grid ,上面放置着一些1 x 1 x 1的正方体。 每个值v = grid[i][j]表示v个正方体叠放在对应单元格(i, j)上。 放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。 请你返回最终这些形体的总表面积。 注意: 每个形体的底面也需要计入表面积中。
示例 1:
输入:grid = [[2]]
输出:10
示例 2:
输入:grid = [[1,2],[3,4]]
输出:34
示例 3:
输入:grid = [[1,0],[0,2]]
输出:16
示例 4:
输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:
输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
n == grid.length
n == grid[i].length
1 <= n <= 50
0 <= grid[i][j] <= 50
首先我们要明确的事,每个物体的表面积是上底 下底 侧面积 = 1 1 grid[i][j] *4
其次,当两个物体相邻的时候,减去的永远是最小的面积,所以如果有面积一面= 4 一面=2 那么总侧面及只需要-2 *2(两个物体的接壤面积都减去)
一、爆破法
爆破法的思维就是,将全部表面积和接壤的表面积sum,最后相减
记住,接壤面积是*2的
执行结果如下:
90 / 90 个通过测试用例
状态:通过
执行用时: 4 ms
内存消耗: 38 MB
代码语言:javascript复制public static int surfaceAreaMe(int[][] grid) {
int len = grid.length;
int lenSub1 = len - 1;
int subArea = 0;
int sumArea = 0;
for (int i = 0; i < len; i ) {
for (int j = 0; j < len; j ) {
// 立方体本应该有的表面积
if (0 != grid[i][j])
sumArea = grid[i][j] * 4 2;
if (i != lenSub1) {
// 一行的相邻列的接壤面积
subArea = 2 * (grid[i][j] > grid[i 1][j] ? grid[i 1][j] : grid[i][j]);
// 一列的相邻行接壤面积
subArea = 2 * (grid[j][i] > grid[j][i 1] ? grid[j][i 1] : grid[j][i]);
}
}
}
return sumArea - subArea;
}
这个解法只有双80,那么我们看看评论区大佬和官方答案的好方案
二、评论区大佬法
这个方法没有双百,但是至少时间上接近100%,我们来看看他的思路
首先是算出单方面高的面积,然后*2返回
执行结果如下:
90 / 90 个通过测试用例
状态:通过
执行用时: 3 ms
内存消耗: 38.2 MB
代码语言:javascript复制public int surfaceArea(int[][] grid) {
int x = 0;
int y = 0;
int z = 0;
for(int i=0; i<grid.length; i ) {
x = grid[i][0];
y = grid[0][i];
z = grid[i][0] != 0 ? 1 : 0;
for(int j=1; j<grid.length; j ) {
// 横相邻比前一个高的数量
x = Math.max(grid[i][j] - grid[i][j-1], 0);
// 纵相邻比前一个高的数量
y = Math.max(grid[j][i] - grid[j-1][i], 0);
// 上下底
z = grid[i][j] != 0 ? 1 : 0;
}
}
return 2 * (x y z);
}
不得不说第二种做法才是我一开始想的,但是因为自己调试了很久都在报错,所以就放弃了,不得不说,自己做不出来的事情一定会有人能做,下次不能轻易放弃自己一开始的办法。