https://leetcode.cn/problems/rectangle-area-ii/ 我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle [i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。 计算平面中所有 rectangles 所覆盖的 总面积 。任何被两个或多个矩形覆盖的区域应只计算 一次 。 返回 总面积 。因为答案可能太大,返回 \(10^9 + 7\) 的 模 。 示例 1:
输入:rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]] 输出:6 解释:如图所示,三个矩形覆盖了总面积为6的区域。 从(1,1)到(2,2),绿色矩形和红色矩形重叠。 从(1,0)到(2,3),三个矩形都重叠。
|
示例 2:
输入:rectangles = [[0,0,1000000000,1000000000]] 输出:49
|
解释:答案是 \(10^{18} 对 (10^9 + 7) \) 取模的结果, 即 49 。 提示:
- 1 <= rectangles.length <= 200
- rectanges[i].length = 4
- \(0 <= x_{i1}, y_{i1}, x_{i2}, y_{i2} <= 10^9\)
- 矩形叠加覆盖后的总面积不会超越 \(2^{63} - 1 \),这意味着可以用一个 64 位有符号整数来保存面积结果。
# 题解
class Solution { public: int rectangleArea(vector<vector<int>>& rectangles) { int n = rectangles.size(); vector<int> hbound; for (const auto& rect: rectangles) { // 下边界 hbound.push_back(rect[1]); // 上边界 hbound.push_back(rect[3]); } sort(hbound.begin(), hbound.end()); hbound.erase(unique(hbound.begin(), hbound.end()), hbound.end()); int m = hbound.size(); // 「思路与算法部分」的 length 数组并不需要显式地存储下来 // length[i] 可以通过 hbound[i+1] - hbound[i] 得到 vector<int> seg(m - 1);
vector<tuple<int, int, int>> sweep; for (int i = 0; i < n; ++i) { // 左边界 sweep.emplace_back(rectangles[i][0], i, 1); // 右边界 sweep.emplace_back(rectangles[i][2], i, -1); } sort(sweep.begin(), sweep.end());
long long ans = 0; for (int i = 0; i < sweep.size(); ++i) { int j = i; while (j + 1 < sweep.size() && get<0>(sweep[i]) == get<0>(sweep[j + 1])) { ++j; } if (j + 1 == sweep.size()) { break; } // 一次性地处理掉一批横坐标相同的左右边界 for (int k = i; k <= j; ++k) { auto&& [_, idx, diff] = sweep[k]; int left = rectangles[idx][1], right = rectangles[idx][3]; for (int x = 0; x < m - 1; ++x) { if (left <= hbound[x] && hbound[x + 1] <= right) { seg[x] += diff; } } } int cover = 0; for (int k = 0; k < m - 1; ++k) { if (seg[k] > 0) { cover += (hbound[k + 1] - hbound[k]); } } ans += static_cast<long long>(cover) * (get<0>(sweep[j + 1]) - get<0>(sweep[j])); i = j; } return ans % static_cast<int>(1e9 + 7); } };
|
复杂度分析:
- 时间复杂度 \(O (n^2)\)
- 空间复杂度 \(O (n)\)