力扣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;
          }
      };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光男孩01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值