snow-swallow / blog

Seek more? Go to Issues :-)
1 stars 0 forks source link

892. 三维形体的表面积 - surfaceArea #72

Open snow-swallow opened 4 years ago

snow-swallow commented 4 years ago

题目

在 N  N 的网格上,我们放置一些 1 1 * 1  的立方体。 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。

思路

这题最大的问题是理解题意= =|||, 看了好久才看出下面这个规律 image v = grid[i][j] 要这样看

[
    [
        d[0][0], d[0][1], …, d[0][j], …
    ],
    [
        d[1][0], d[1][1], …, d[1][j], …
    ],
    …,
    [
        d[i][0], d[i][1], …, d[i][j], …
    ],
    …
]

回到解题思路:累加每个d[i][j] 的有效表面积

  1. 每个d[i][j] 的有效表面积= 4*d[i][j] - 2
  2. 和上下左右的重叠面积=getReduceArea(i,j,grid) - 这个基本就是一旦相交就取较小值 (此处和最大岛屿面积类似 #55 ,但岛屿是二维的)

代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
var surfaceArea = function(grid) {
    let count = 0;
    function getReduceArea(grid, i, j) {
        count = 0;
        if (i < grid.length-1) {
            count += Math.min(grid[i][j], grid[i+1][j]);
        }
        if (i > 0) {
            count += Math.min(grid[i][j], grid[i-1][j]);
        } 
        if (j < grid[i].length-1) {
            count += Math.min(grid[i][j], grid[i][j+1]);
        } 
        if (j > 0) {
            count += Math.min(grid[i][j], grid[i][j-1]);
        }
        return count;
    }

    let area = 0;
    for (let i = 0; i < grid.length; i ++) {
        for (let j = 0; j < grid[i].length; j ++) {
            if (grid[i][j] > 0) {
                area += 4* grid[i][j] + 2 - getReduceArea(grid, i, j);
            }
        }
    }
    return area;
};

测试用例

示例 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

image

Reference

https://leetcode-cn.com/problems/surface-area-of-3d-shapes/ https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/