2021.11.16 - 152.完美矩形

1. 题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 思路

(1) HashMap

  • 多个小矩形组成完美矩形的充分必要条件是:
    1. 所有小矩形的四个顶点中,只有完美矩形的四个顶点出现了1次,其他顶点均出现2次或者4次;
    2. 所有小矩形的面积之和等于完美矩形的面积。
  • 利用HashMap存储所有小矩形的四个顶点及其出现的次数,根据组成完美矩形的充分必要条件判断其是否能组成完美矩形。

3. 代码

import java.util.*;

public class Test {
    
    
    public static void main(String[] args) {
    
    
    }
}

class Solution {
    
    
    public boolean isRectangleCover(int[][] rectangles) {
    
    
        Map<Coordinate, Integer> map = new HashMap<>();
        int area = 0;
        for (int[] rectangle : rectangles) {
    
    
            Coordinate c1 = new Coordinate(rectangle[0], rectangle[1]);
            Coordinate c2 = new Coordinate(rectangle[0], rectangle[3]);
            Coordinate c3 = new Coordinate(rectangle[2], rectangle[1]);
            Coordinate c4 = new Coordinate(rectangle[2], rectangle[3]);
            map.put(c1, map.getOrDefault(c1, 0) + 1);
            map.put(c2, map.getOrDefault(c2, 0) + 1);
            map.put(c3, map.getOrDefault(c3, 0) + 1);
            map.put(c4, map.getOrDefault(c4, 0) + 1);
            area += ((rectangle[2] - rectangle[0]) * (rectangle[3] - rectangle[1]));
        }
        List<Coordinate> list = new ArrayList<>();
        for (Map.Entry<Coordinate, Integer> entry : map.entrySet()) {
    
    
            if (entry.getValue() == 2 || entry.getValue() == 4) {
    
    
                continue;
            }
            if (entry.getValue() == 1 && list.size() < 4) {
    
    
                list.add(entry.getKey());
            } else {
    
    
                return false;
            }
        }
        if (list.size() != 4) {
    
    
            return false;
        }
        int minX = Integer.MAX_VALUE;
        int minY = Integer.MAX_VALUE;
        int maxX = Integer.MIN_VALUE;
        int maxY = Integer.MIN_VALUE;
        for (Coordinate coordinate : list) {
    
    
            minX = Math.min(minX, coordinate.x);
            minY = Math.min(minY, coordinate.y);
            maxX = Math.max(maxX, coordinate.x);
            maxY = Math.max(maxY, coordinate.y);
        }
        return (maxX - minX) * (maxY - minY) == area;
    }
}

class Coordinate {
    
    
    public int x;
    public int y;

    public Coordinate(int x, int y) {
    
    
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (!(o instanceof Coordinate)) return false;
        Coordinate that = (Coordinate) o;
        return x == that.x && y == that.y;
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(x, y);
    }

    @Override
    public String toString() {
    
    
        return "Coordinate{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44021223/article/details/121360260