前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >脚撕LeetCode(892)Easy

脚撕LeetCode(892)Easy

作者头像
用户6203048
发布2022-01-18 08:18:01
1420
发布2022-01-18 08:18:01
举报
文章被收录于专栏:JathonKatuJathonKatu

题目地址:https://leetcode-cn.com/problems/to-lower-case/submissions/

给你一个 n n 的网格grid ,上面放置着一些1 x 1 x 1的正方体。 每个值v = grid[i][j]表示v个正方体叠放在对应单元格(i, j)上。 放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。 请你返回最终这些形体的总表面积。 注意: 每个形体的底面也需要计入表面积中。

代码语言:javascript
复制
示例 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);
}

不得不说第二种做法才是我一开始想的,但是因为自己调试了很久都在报错,所以就放弃了,不得不说,自己做不出来的事情一定会有人能做,下次不能轻易放弃自己一开始的办法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JathonKatu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档