使用扫描的方法,并合并矩形的高
class Solution {
public:
static bool cmp(pair<int, int>& x, pair<int, int>& y) { // 快排矩形的区间
return x.first == y.first ? x.second < y.second : x.first < y.first;
}
int rectangleArea(vector<vector<int>>& rectangles) {
long long res = 0;
int n = rectangles.size(), i, j;
vector<int> edge;
for(i = 0; i < n; i++) { // 获得矩形所有的入边和出边,并进行排序去重
edge.push_back(rectangles[i][0]);
edge.push_back(rectangles[i][2]);
}
sort(edge.begin(), edge.end());
edge.erase(unique(edge.begin(), edge.end()), edge.end());
for(i = 1; i < (int)edge.size(); i++) {
long long length = edge[i] - edge[i - 1]; // 表示矩形的宽
vector<pair<int, int>> edgeH; // 保存矩形的高
for(j = 0; j < n; j++) {
if(rectangles[j][0] <= edge[i - 1] && rectangles[j][2] >= edge[i]) {
pair<int, int> tmp;
tmp.first = rectangles[j][1];
tmp.second = rectangles[j][3];
edgeH.push_back(tmp);
}
}
sort(edgeH.begin(), edgeH.end(), cmp);
int l = -1, r = -1;
long long height = 0;
for(j = 0; j < (int)edgeH.size(); j++) {
if(edgeH[j].first > r) { // 当目前矩形的高超出l和r时进行l和r的更新
height += edgeH[j].second - edgeH[j].first;
l = edgeH[j].first;
r = edgeH[j].second;
} else if(edgeH[j].second > r) { // 当目前矩形的高超出r时进行更新r
height += edgeH[j].second - r;
r = edgeH[j].second;
}
}
res += length * height;
}
return res % static_cast<int>(1e9 + 7);
}
};