LeetCode 892. 三维形体的表面积

892. 三维形体的表面积

在 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


题解:

  • 加法:每个位置V贡献的面积 = 顶 + 底 + 侧面
  • 减法:总面积 - 重叠的面积

// add
class Solution {
public:
    int surfaceArea(vector<vector<int>>& grid) {
        if (grid.empty()) {
            return 0;
        }
        int row = grid.size();
        int col = grid[0].size();

        int x[4] = { -1, 0, 1, 0 };
        int y[4] = { 0, 1, 0, -1 };

        int rst = 0;
        for (size_t i = 0; i < row; i++) {
            for (size_t j = 0; j < col; j++) {
                if (grid[i][j] != 0) {
                    rst += 2; // 顶和底
                    for (size_t q = 0; q < 4; q++) {
                        int tmpX = i + x[q];
                        int tmpY = j + y[q];
                        if (tmpX >= 0 && tmpX < row && tmpY >= 0 && tmpY < col) {
                            rst += max(grid[i][j] - grid[tmpX][tmpY], 0); // 差值
                        } else {
                            rst += grid[i][j]; // 边界
                        }
                    }
                }
            }
        }
        return rst;
    }
};

// delete
class SolutionDel {
public:
    int surfaceArea(vector<vector<int>>& grid) {
        if (grid.empty()) {
            return 0;
        }
        int row = grid.size();
        int col = grid[0].size();

        int x[4] = { -1, 0, 1, 0 };
        int y[4] = { 0, 1, 0, -1 };

        int rst = 0;
        for (size_t i = 0; i < row; i++) {
            for (size_t j = 0; j < col; j++) {
                if (grid[i][j] != 0) {
                    rst += (6 * grid[i][j]); // 6个面
                    rst -= (2 * (grid[i][j] - 1)); // 叠放重叠部分
                    for (size_t q = 0; q < 4; q++) {
                        int tmpX = i + x[q];
                        int tmpY = j + y[q];
                        if (tmpX >= 0 && tmpX < row && tmpY >= 0 && tmpY < col) {
                            rst -= min(grid[i][j], grid[tmpX][tmpY]); // 重叠部分
                        }
                    }
                }
            }
        }
        return rst;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值