前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 391. 完美矩形(set检查顶点+面积检查)

LeetCode 391. 完美矩形(set检查顶点+面积检查)

作者头像
Michael阿明
发布2020-07-13 15:50:09
5530
发布2020-07-13 15:50:09
举报

1. 题目

我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。

每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 1:
rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [3,2,4,4],
  [1,3,2,4],
  [2,3,3,4]
]
返回 true。5个矩形一起可以精确地覆盖一个矩形区域。
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 2:
rectangles = [
  [1,1,2,3],
  [1,3,2,4],
  [3,1,4,2],
  [3,2,4,4]
]
返回 false。两个矩形之间有间隔,无法覆盖成一个矩形。
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 3:
rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [1,3,2,4],
  [3,2,4,4]
]
返回 false。图形顶端留有间隔,无法覆盖成一个矩形。
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
示例 4:
rectangles = [
  [1,1,3,3],
  [3,1,4,2],
  [1,3,2,4],
  [2,2,4,4]
]
返回 false。因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。
代码语言:javascript
复制
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • set 查找四个顶点,在set中,说明重叠删除,不在set中,加入set
  • 同时记录所有小矩形 面积之和 s,还有x,y的最大最小范围
  • 最后set中的顶点只能是四个角,且面积 s = (x_max - x_min)*(y_max - y_min)
代码语言:javascript
复制
class Solution {
public:
    bool isRectangleCover(vector<vector<int>>& ret) {
        set<pair<int,int>> s;
        int x1 = INT_MAX, y1 = INT_MAX, x2 = INT_MIN, y2 = INT_MIN, area = 0;
        for(int i = 0; i < ret.size(); ++i)
        {
            x1 = min(ret[i][0],x1);
            x2 = max(ret[i][2],x2);
            y1 = min(ret[i][1],y1);
            y2 = max(ret[i][3],y2);
            area += (ret[i][2]-ret[i][0])*(ret[i][3]-ret[i][1]);

            if(s.find({ret[i][0],ret[i][1]})==s.end())
            	s.insert({ret[i][0],ret[i][1]});
            else
            	s.erase({ret[i][0],ret[i][1]});

            if(s.find({ret[i][2],ret[i][3]})==s.end())
            	s.insert({ret[i][2],ret[i][3]});
            else
            	s.erase({ret[i][2],ret[i][3]});

            if(s.find({ret[i][0],ret[i][3]})==s.end())
            	s.insert({ret[i][0],ret[i][3]});
            else
            	s.erase({ret[i][0],ret[i][3]});

            if(s.find({ret[i][2],ret[i][1]})==s.end())
            	s.insert({ret[i][2],ret[i][1]});
            else
            	s.erase({ret[i][2],ret[i][1]});
        }

        if(s.size() !=4 || !s.count({x1,y1}) || !s.count({x1,y2}) 
        				|| !s.count({x2,y1}) || !s.count({x2,y2}))
        	return false;
        return area == (x2-x1)*(y2-y1);
    }
};

304 ms 26 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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