LeetCode解析------391.完美矩形

题目:

我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。
每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1)
以及右上角的点的坐标为 (2, 2) )。

简单介绍:
完美矩形,题目难度:困难,使用语言:JAVA。
第一次接触力扣的困难题,难度还是有点大的。

解题思路:
1.小矩形的面积之和等于大矩形的面积。
这一点,相信大家都可以很容易的想到,基本可以PASS掉图形重复、图形缺失的情况。
但是,该条件对于确保小矩形完美覆盖大矩形还是不够严谨。
所以,我参考了一下大神的思路,引申出来第二点。
2.小矩形之间的连接点只能出现偶数次。
两个小矩形若想组成一个新的矩形,小矩形之间的连接点,出现2次。
四个小矩形若想组成一个新的矩形,小矩形正中的连接点,出现4次,边缘的连接点出现2次。
3.有了1和2这两个条件的约束就可以保证,这个矩形是完美矩形了。

在这里插入图片描述

代码部分:

class Solution {
    public boolean isRectangleCover(int[][] rectangles) {
        int left=Integer.MAX_VALUE;//最左下横坐标
		int bottom=Integer.MAX_VALUE;
		int right=Integer.MIN_VALUE;//最右上横坐标
		int top=Integer.MIN_VALUE;
		int n=rectangles.length;//小矩形个数
		//哈希集合
		Set<String> set=new HashSet<>();
		int area=0;
		for(int i=0;i<n;i++) {
			//获取四个点的坐标
			left=Math.min(left, rectangles[i][0]);
			bottom=Math.min(bottom, rectangles[i][1]);
			right=Math.max(right, rectangles[i][2]);
			top=Math.max(top, rectangles[i][3]);
			//计算小矩形的面积
			area+=(rectangles[i][3]-rectangles[i][1])*(rectangles[i][2]-rectangles[i][0]);
			//计算小矩阵的坐标
			String lt=rectangles[i][0]+","+rectangles[i][1];
			String bm=rectangles[i][0]+","+rectangles[i][3];
			String rt=rectangles[i][2]+","+rectangles[i][1];
			String tp=rectangles[i][2]+","+rectangles[i][3];
			//没有则加入,有则删除
			if(!set.contains(lt)) set.add(lt);
			else set.remove(lt);
			if(!set.contains(bm)) set.add(bm);
			else set.remove(bm);
			if(!set.contains(rt)) set.add(rt);
			else set.remove(rt);
			if(!set.contains(tp)) set.add(tp);
			else set.remove(tp);
		}
			//判断是否是完美矩形:1.面积之和相等 2.只剩下4个坐标
			if(set.size()==4&&set.contains(left+","+bottom)&&set.contains(left+","+top)&&set.contains(right+","+bottom)&&set.contains(right+","+top))
				return area==((top-bottom)*(right-left));
			else return false;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

发布了5 篇原创文章 · 获赞 3 · 访问量 111

猜你喜欢

转载自blog.csdn.net/weixin_44337475/article/details/105462728