- 题目:(简单)
在 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
- 我的想法思路
表面积的话,想到的是三视图的面积然后乘以2。如何去求解三视图呢?
眉头一皱,发现不对劲!如果中间是挖空的话,三视图肯定是不行的!!!这个思路 (错)!
另辟蹊径!
发现每个立方体的表面积都是6,两个立方体时,可能是12也可能是10。为什么呢?因为连接部分导致减少了,每有一个连接面,则表面积减少2。所以如何去求解所有立方体的连接面呢?
从上到下,从左到右依次遍历,然后每次都只减去本身连接面,右方连接面,下方连接面。
class Solution {
public int surfaceArea(int[][] grid) {
int s = 0;
int N = grid.length;
//长宽+1,防止后面数组越界。
int[][] grids = new int[N+1][N+1];
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
grids[i][j] = grid[i][j];
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
int temp = grids[i][j] * 6;
//减去竖直连接面
if(grids[i][j] > 1){
temp -= (grids[i][j] - 1) * 2;
}
//减去右方连接面
if(grids[i+1][j] != 0){
//左边高度 小于等于 右边高度,减去左边高度
if(grids[i][j] <= grids[i+1][j]){
temp -= grids[i][j] * 2;
}
//左边高度 大于 右边高度,减去右边高度
if(grids[i][j] > grids[i+1][j]){
temp -= grids[i+1][j] * 2;
}
}
//减去下方连接面
if(grids[i][j] != 0){
//上方高度 小于等于 下方高度,减去上方高度
if(grids[i][j] <= grids[i][j+1]){
temp -= grids[i][j] * 2;
}else{
temp -= grids[i][j+1] * 2;
}
}
s += temp;
}
}
return s;
}
}
代码有点丑,哈哈哈哈,因为怕数组越界了,而且还不知道怎么增加长度,所以只好老老实实遍历赋值。又是吃了代码的亏!!!!在网上没找到怎么赋值。
- 看看大佬
class Solution {
public int surfaceArea(int[][] grid) {
int n = grid.length, area = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 先把grid[i][j]赋值给level,省掉了bound check,可以略微略微略微优化一下耗时。。。
int level = grid[i][j];
if (level > 0) {
// 一个柱体中:2个底面 + 所有的正方体都贡献了4个侧表面积
area += (level << 2) + 2;
// 减掉 i 与 i-1 相贴的两份表面积
area -= i > 0? Math.min(level, grid[i - 1][j]) << 1: 0;
// 减掉 j 与 j-1 相贴的两份表面积
area -= j > 0? Math.min(level, grid[i][j - 1]) << 1: 0;
}
}
}
return area;
}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
想法是差不多的,但是这个代码好简洁,看完之后发现我的代码也可以优化了,不用遍历赋值给grids,只需要判断就可以了!!而且这个代码好看的不得了。可以用到min函数,就不用判断,位运算,而且三目运算符!!太美了。好好学习!
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。