LeetCode解析------391.完美矩形
程序员文章站
2022-07-13 12:02:31
...
题目:
我们有 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
上一篇: WPF点击不同界面上的按钮实现界面切换
下一篇: 391 - 完美矩形问题