391. Perfect Rectangle

2017-09-02  本文已影响0人  Jeanz

Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover of a rectangular region.
Each rectangle is represented as a bottom-left point and a top-right point. For example, a unit square is represented as [1,1,2,2]. (coordinate of bottom-left point is (1, 1) and top-right point is (2, 2)).


Example 1:
rectangles = [ [1,1,3,3], [3,1,4,2], [3,2,4,4], [1,3,2,4], [2,3,3,4]]Return true. All 5 rectangles together form an exact cover of a rectangular region.
Example 2:
rectangles = [ [1,1,2,3], [1,3,2,4], [3,1,4,2], [3,2,4,4]]Return false. Because there is a gap between the two rectangular regions.
Example 3:
rectangles = [ [1,1,3,3], [3,1,4,2], [1,3,2,4], [3,2,4,4]]Return false. Because there is a gap in the top center.
Example 4:
rectangles = [ [1,1,3,3], [3,1,4,2], [1,3,2,4], [2,2,4,4]]Return false. Because two of the rectangles overlap with each other.

一刷
题解:

  1. 大矩形的面积等于所有小矩形之和。满足条件的小矩形并不会重合。
  2. 非外边框的顶点肯定会至少出现两次。于是我们构造一个set, 如果里面已经有了这个点,则移除。最后要满足set中点的数目为4
class Solution {
    public boolean isRectangleCover(int[][] rectangles) {
        if(rectangles.length == 0 || rectangles[0].length == 0) return false;
        int x1 = Integer.MAX_VALUE;
        int x2 = Integer.MIN_VALUE;
        int y1 = Integer.MAX_VALUE;
        int y2 = Integer.MIN_VALUE;
        
        Set<String> set = new HashSet<>();
        int area = 0;
        for(int[] rect: rectangles){
            x1 = Math.min(rect[0],x1);
            y1 = Math.min(rect[1], y1);
            x2 = Math.max(rect[2], x2);
            y2 = Math.max(rect[3], y2);
            
            area += (rect[2] - rect[0])*(rect[3] - rect[1]);
            // the four corner node
            String s1 = rect[0]+" "+rect[1];
            String s2 = rect[0]+" "+rect[3];
            String s3 = rect[2]+" "+rect[3];
            String s4 = rect[2]+" "+rect[1];
            if(!set.add(s1)) set.remove(s1);//already have, then remove
            if(!set.add(s2)) set.remove(s2);
            if(!set.add(s3)) set.remove(s3);
            if(!set.add(s4)) set.remove(s4);
        }
        
        if(!set.contains(x1+" "+y1) || !set.contains(x1+" "+y2) || !set.contains(x2+" "+y1) || !set.contains(x2+" "+y2) || set.size()!=4) return false;
        
        return area == (x2 - x1) * (y2 - y1);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读