leetcode刷题记录-883. 三维形体投影面积

127 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

前言

今天的题目为简单,简单题,稍微用上一点点空间思维,x方向看过去的平面就是每一列的最大值,y方向看过去就是每一行的最大值。

每日一题

今天的题目是 883. 三维形体投影面积,难度为简单

  • 在 n x n 的网格 grid 中,我们放置了一些与 x,y,z 三轴对齐的 1 x 1 x 1 立方体。

  • 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。

  • 现在,我们查看这些立方体在 xy 、yz 和 zx 平面上的投影。

  • 投影 就像影子,将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时,我们会看到“影子”。

  • 返回 所有三个投影的总面积 。

 

示例 1:

输入:[[1,2],[3,4]]
输出:17
解释:这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。

示例 2:

输入:grid = [[2]]
输出:5

示例 3:

输入:[[1,0],[0,2]]
输出:8

 

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 50
  • 0 <= grid[i][j] <= 50

题解

暴力解法

简单的暴力解法,首先需要去了解题目要我们求什么,题目的答案是三个面的面积之和,我们就设三个面的面积分别为 z, x, y, 其中最好求的应该从上往下看这个面,为数组中不为0的数,因为0的话就没有影子了。

然后x和y的求法完全相反,双重循环遍历传入的二维数组。

image.png

x 的话就是先遍历每一个数组的第一项,然后第二项...

y 的话就是先遍历第一个数组,然后第二个数组...

x 和 y 的双重循环完全相反,所以我们需要写两个双重循环来遍历,至于z只需要随便找一个丢进去判断当前的位置的值是不是0就能够统计不为0的个数了

/**
 * @param {number[][]} grid
 * @return {number}
 */
var projectionArea = function(grid) {
    let z = 0
    let x = 0
    let y = 0
    grid.forEach(e1=>{
        let yMax = 0
        e1.forEach(e2=>{
            yMax = Math.max(e2,yMax)
            if(e2 != 0) z++
        })
        y+=yMax
    })

    for(let i=0;i<grid[0].length;i++){
        let xMax = 0
        grid.forEach(e=>{
            xMax = Math.max(e[i],xMax)
        })
        x+=xMax
    }

    return z+x+y
};

image.png

优化

发现题目给出的是 n*n 的网格,这样我们可以把两个双重循环何为一个一起计算

/**
 * @param {number[][]} grid
 * @return {number}
 */
var projectionArea = function(grid) {
    let z = 0
    let x = 0
    let y = 0
    let n = grid.length
    for(let i=0;i<n;i++){
        let yMax=0
        let xMax=0
        for(let j=0;j<n;j++){
            if(grid[i][j]!=0){
                z++
            }
            yMax = Math.max(yMax,grid[i][j])
            xMax = Math.max(xMax,grid[j][i])
        }
        x+=xMax
        y+=yMax
    }

    return z+x+y
};

image.png