力扣850.矩形面积 II
力扣850.矩形面积 II
-
扫描线
-
将所有给定的矩形的左右端点提取出来并排序(每一条红线代表一个端点)
-
转化为子问题:求两条线卡住的矩形面积
-
遍历所有给定的矩形,在两条线之间的合并,取最大长度
-
class Solution { const int N = 1e9+7; public: int rectangleArea(vector<vector<int>>& rectangles) { vector<int> lines; //所有x入队 for(vector<int> &v:rectangles) { lines.emplace_back(v[0]); lines.emplace_back(v[2]); } ranges::sort(lines); int res=0; //遍历每两条线 for(int i=1;i<lines.size();i++) { int l = lines[i-1],r = lines[i]; if(l == r) continue; //存这两条线之间的矩形上下边坐标 vector<pair<int,int>> edges; for(vector<int> &v:rectangles) //被包含在两条线之间了 if(v[0] <= l && v[2] >= r) edges.push_back({v[1],v[3]}); //按下端排序 ranges::sort(edges); int up = -1,down = -1; long long len = 0; for(pair<int,int> &p:edges) { //尾大于原来的头 if(p.first > up) { //把前一段先加上 len += up - down; //更新成后一段 down = p.first; up = p.second; } //新的头更优 else if(p.second > up) up = p.second; } //把当前段加上 len += up - down; //长乘宽求得面积 len *= r - l; len %= N; res = (res + len) % N; } return res; } };