fucking-algorithm icon indicating copy to clipboard operation
fucking-algorithm copied to clipboard

如何判定完美矩形 :: labuladong的算法小抄

Open utterances-bot opened this issue 4 years ago • 8 comments
trafficstars

文章链接点这里:如何判定完美矩形

评论礼仪 见这里,违者直接拉黑。

utterances-bot avatar Nov 16 '21 03:11 utterances-bot

这个题没做过类似题还真想不到

lcfgrn avatar Nov 16 '21 03:11 lcfgrn

也就是说,当某一个点同时是 2 个或者 4 个小矩形的顶点时,该点最终不是顶点;

但如果2个矩形完全重合,那么这4个顶点全部同时是2个矩形的定点呢

wangpeiming110 avatar Nov 17 '21 08:11 wangpeiming110

回复楼上,如果4个顶点全部同时是2个矩形的顶点,那么set最终为空

Park-J-lab avatar Nov 18 '21 09:11 Park-J-lab

@labuladong 其实,只要保证最后len(points) = 4 以及 actual_area = expected_area即可,无需再检查留下的 4 个顶点是否是完美矩形的顶点。 因为只要len(points) = 4,那么说明留下的四个顶点必定会组成一个矩形,而actual_area = expected_area可以保证不会有重叠区域。这两项已经构成了充分条件。

Park-J-lab avatar Nov 18 '21 09:11 Park-J-lab

Java版

class Solution {
    public boolean isRectangleCover(int[][] rectangles) {
        int X1 = Integer.MAX_VALUE, Y1 = Integer.MAX_VALUE, X2 = Integer.MIN_VALUE, Y2 = Integer.MIN_VALUE;
        Set<String> points = new HashSet<>();
        int actual_area = 0;
        for(int[] item : rectangles){
            int x1 = item[0], y1 = item[1], x2 = item[2], y2 = item[3];
            X1 = Math.min(X1, x1);Y1 = Math.min(Y1, y1);
            X2 = Math.max(X2, x2);Y2 = Math.max(Y2, y2);
            actual_area += (x2-x1)*(y2-y1);
            int[] p1 = new int[]{x1,y1};int[] p2 = new int[]{x1,y2};
            int[] p3 = new int[]{x2,y1};int[] p4 = new int[]{x2,y2};
            for(int[] p : new int[][]{p1,p2,p3,p4}){
                String s = p[0] + "," + p[1];
                if(points.contains(s)){
                    points.remove(s);
                }else{
                    points.add(s);
                }
            }
        }
        int expected_area = (X2-X1)*(Y2-Y1);
        if(actual_area != expected_area){
            return false;
        }
        if(points.size() != 4) return false;
        String s1 = X1 + "," + Y1;
        String s2 = X1 + "," + Y2;
        String s3 = X2 + "," + Y1;
        String s4 = X2 + "," + Y2;
        if(!points.contains(s1)) return false;
        if(!points.contains(s2)) return false;
        if(!points.contains(s3)) return false;
        if(!points.contains(s4)) return false;
        return true;
    }
}

deepbreath373 avatar Jan 29 '22 08:01 deepbreath373

@labuladong 东哥,这一题的题解在 插件中的思路没有更新,插件中的思路代码没有判断最后的 理想顶点情况 image

zhongweiLeex avatar Apr 13 '22 00:04 zhongweiLeex

@zhongweiLeex 感谢指出,已修正~

labuladong avatar Apr 13 '22 07:04 labuladong

check in

deepbreath373 avatar Aug 04 '22 14:08 deepbreath373

重复举行给的贴图好像标错了?rectangles=[[0,0,3,1],[0,0,3,1],[0,3,3,4]]

freezer2046 avatar Aug 17 '22 21:08 freezer2046

@labuladong 重复矩形应该是[[0,0,3,1],[0,0,3,1],[0,2,3,3]]吧,这样两个area算出来一样,所以才要四个if来判断?

RW2918 avatar Aug 29 '22 07:08 RW2918