883 三维形体投影面积

题目描述:
在 N * N 的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1 立方体。

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

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

投影就像影子,将三维形体映射到一个二维平面上。

在这里,从顶部、前面和侧面看立方体时,我们会看到“影子”。

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

示例 1:
输入:[[2]]
输出:5

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

示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:14

示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:21

提示:
1 <= grid.length = grid[0].l

方法1:
主要思路:
(1)保存每一行的最大值,每一列的最大值,和不为0的元素的位置的数量(作为底板面积);
(2)将每一行的和每一列的最大值加到面积中即为所要投影面积;

class Solution {
public:
    int projectionArea(vector<vector<int>>& grid) {
    	//保存各行的最大值
        vector<int> left_mp(grid.size(),0);
        //保存各列的最大值
        vector<int> front_mp(grid.size(),0);
        int area=0;//面积值
        for(int i=0;i<grid.size();++i){
            for(int j=0;j<grid[0].size();++j){
            	//行最大值
                left_mp[i]=max(left_mp[i],grid[i][j]);
                //列最大值
                front_mp[j]=max(front_mp[j],grid[i][j]);
                //底部面积
                if(grid[i][j]){
                    ++area;
                }
            }
        }
        //将另外两个方向的投影放到面积中
        for(int& it:left_mp){
            area+=it;
        }
        for(int& it:front_mp){
            area+=it;
        }
        return area;
    }
};

方法2:
主要思路:
(1)直接在一次遍历中,通过调整左边的索引,获得当前的行最大值和列最大值,减少内存的使用;

class Solution {
public:
    int projectionArea(vector<vector<int>>& grid) {
        int area=0;
        int cur_row_max=0;
        int cur_col_max=0;
        for(int i=0;i<grid.size();++i){
            cur_row_max=0;//当前行的最大值
            cur_col_max=0;//当前列的最大值
            for(int j=0;j<grid[0].size();++j){
                cur_row_max=max(cur_row_max,grid[i][j]);
                cur_col_max=max(cur_col_max,grid[j][i]);
                if(grid[i][j]){//底部的面积
                    ++area;
                }
            }
            //总的面积
            area+=cur_row_max+cur_col_max;
        }
        return area;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值