美文网首页
完美矩形

完美矩形

作者: xialu | 来源:发表于2021-11-16 21:43 被阅读0次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-rectangle

题目描述:

给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。
如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。

示例 1:


输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]
输出:true
解释:5 个矩形一起可以精确地覆盖一个矩形区域。

示例 2:


输入:rectangles = [[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]
输出:false
解释:两个矩形之间有间隔,无法覆盖成一个矩形。

示例 3:


输入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[3,2,4,4]]
输出:false
解释:图形顶端留有空缺,无法覆盖成一个矩形。

示例 4:


输入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]
输出:false
解释:因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。

代码实现:
class Solution {
    public boolean isRectangleCover(int[][] rectangles) {
        int x = 10001, y = 10001, a = -10001, b = -10001;
        long s = 0;
        Map<String, Integer> cnts = new HashMap<>();
        for(int[] r: rectangles){
            x = Math.min(x, r[0]);
            y = Math.min(y, r[1]);
            a = Math.max(a, r[2]);
            b = Math.max(b, r[3]);
            s += (r[3] - r[1]) * (r[2] - r[0]);
            String p1 = point(r[0], r[1]), p2 = point(r[0],r[3]), p3 = point(r[2], r[1]), p4 = point(r[2],r[3]);
            cnts.put(p1, cnts.getOrDefault(p1, 0) + 1);
            cnts.put(p2, cnts.getOrDefault(p2, 0) + 1);
            cnts.put(p3, cnts.getOrDefault(p3, 0) + 1);
            cnts.put(p4, cnts.getOrDefault(p4, 0) + 1);
        }
        if(s != (a - x) * (b - y))
            return false;
        Set<String> points = new HashSet<>(){};
        points.add(point(x, y)); 
        points.add(point(x, b));
        points.add(point(a, y));
        points.add(point(a, b));
        for(String p:points){
            if(!cnts.containsKey(p) || cnts.get(p) != 1)
                return false;
        }
        for(String p:cnts.keySet()){
            if(!points.contains(p)){
                int v = cnts.get(p);
                if(v > 4 || v % 2 != 0)
                    return false;
            }
        }
        return true;
    }

    private String point(int x, int y){
        return String.format("%d,%d",x,y);
    }
}

相关文章

  • 完美矩形

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/perfec...

  • 391. 完美矩形

    391. 完美矩形[https://leetcode-cn.com/problems/perfect-rectan...

  • LeetCode刷题-完美矩形

    前言说明 算法学习,日常刷题记录。 题目连接 完美矩形[https://leetcode-cn.com/probl...

  • [58]完美矩形-小米2018秋

    1.题目描述 给定n个轴对齐的矩形其中n>0, 判断他们组合在一起能否覆盖一个完美的矩形区域(无重叠,无空隙)每个...

  • 2021-11-16 391 完美矩形

    满足矩形区域的面积等于所有矩形的面积之和,还要满足矩形区域四角的顶点只能出现一次,且其余顶点的出现次数只能是两次或...

  • Canvas-矩形绘制-Day01

    01矩形入门 02矩形进阶 03矩形高级 清屏

  • Java输出形状

    输出矩形 以此矩形案例(4行,9列的矩形)为例 前面有空格的矩形 以此矩形案例(4行,9列的矩形)为例 输出平行四...

  • canvas-rect

    canvas画矩形 gd.strokeRect(矩形左上角x,矩形左上角y,矩形宽,矩形高);还可以使用填充 通过...

  • 这个世界是矩形的

    这个世界是矩形的 书本是矩形的 天空是矩形的 笔的投影的矩形的 傻傻的地铁是矩形的 嘻嘻,我想把这个发现告诉你 发...

  • 有效矩形,无效矩形

    InvalidateRect(HWND) 使窗口无效 产生消息WM_PAINT; ValidateRect...

网友评论

      本文标题:完美矩形

      本文链接:https://www.haomeiwen.com/subject/lkkktrtx.html