LeetCode 391 完美矩形[set 逻辑] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 391 完美矩形[set 逻辑] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路
解决这道问题方法其实很简单,只是步骤比较繁琐,首先解题前得知道,只有小矩形面积之和等于大矩形面积且除了四个拐角的点单独出现其他点都是成对出现才是完美矩形,既然如此,那么我们做的步骤如下:
- 统计小矩形面积,更新左下右上四个值(左下找最小,右上找最大);
- 把每次遍历到的矩形四点坐标放入set中,重复的就去除;
- 观察set中是否剩下四个坐标,并且四个坐标是满足左下右上四个值组合起来的;
- 3满足且大小矩形面积相等返回true,不满足返回false。
代码如下:
代码
class Solution {
public:
bool isRectangleCover(vector<vector<int>>& rectangles) {
// 定义总面积和左右上下四个定位坐标
int sumArea = 0;
int left = INT_MAX;
int low = INT_MAX;
int right = INT_MIN;
int high = INT_MIN;
set<string> s;
for(vector<int> rectangle : rectangles) {
//获取坐标
left = min(left, rectangle[0]);
low = min(low, rectangle[1]);
right = max(right, rectangle[2]);
high = max(high, rectangle[3]);
// 面积求和
sumArea += (rectangle[2] - rectangle[0]) * (rectangle[3] - rectangle[1]);
// 将坐标转成string
string ll = to_string(rectangle[0]) + " " + to_string(rectangle[1]);
string lr = to_string(rectangle[2]) + " " + to_string(rectangle[1]);
string hl = to_string(rectangle[0]) + " " + to_string(rectangle[3]);
string hr = to_string(rectangle[2]) + " " + to_string(rectangle[3]);
// 放入set中,如果有就移除 没有就加入
if(!s.count(ll)) s.insert(ll);
else s.erase(ll);
if(!s.count(lr)) s.insert(lr);
else s.erase(lr);
if(!s.count(hl)) s.insert(hl);
else s.erase(hl);
if(!s.count(hr)) s.insert(hr);
else s.erase(hr);
}
string ll = to_string(left) + " " + to_string(low);
string lr = to_string(right) + " " + to_string(low);
string hl = to_string(left) + " " + to_string(high);
string hr = to_string(right) + " " + to_string(high);
// 判断是否只剩下四个并且打矩形面积等于小矩形面积之和
if(s.size() == 4 && s.count(ll) && s.count(lr) && s.count(hl) && s.count(hr)) {
return sumArea == (high - low) * (right - left);
}
return false;
}
};
以上是关于LeetCode 391 完美矩形[set 逻辑] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 391. 完美矩形(扫描线) / 318. 最大单词长度乘积 / 563. 二叉树的坡度
2022-01-21:完美矩形。 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi,