【leetcode】【2022/9/16】850. 矩形面积 II

news/2024/5/10 6:08:09/文章来源:https://blog.csdn.net/weixin_44705592/article/details/126896070

问题描述:

  • 我们给出了一个(轴对齐的)二维矩形列表 rectangles
    • 对于 rectangle[i] = [x1, y1, x2, y2],其中 (x1,y1) 是矩形 i 左下角的坐标,(xi1, yi1) 是该矩形左下角的坐标, (xi2, yi2) 是该矩形右上角的坐标。
  • 计算平面中所有 rectangles 所覆盖的总面积,任何被两个或多个矩形覆盖的区域应只计算一次。
  • 返回总面积,因为答案可能太大,返回 10^9 + 7 的模。
  • 输入:rectangles = [[0,0,2,2],[1,0,2,3],[1,0,3,1]]
  • 输出:6
  • 图例:
    示例

核心思路:

  • 该题是扫描线题目。【扫描线题目其实就是一类区间问题,如官方题解所讲解的那样,扫描线就是一种离散化的技巧,将大范围的连续的坐标转化成离散的坐标
  • 暴力解法其实不难理解。
    • 矩形面积其实就是宽和高,固定宽,进而求每一个不重叠的高。
    • 具体来说,把一个矩形范围视作两个行和两个列(离散化)。
    • 首先,行与行之间的距离就是宽,宽是固定的。
    • 接着,再处理列与列的重叠关系,因为本题数据量较低,暴力法可以直接搜索所有矩形,选出当前宽所囊括的所有矩形,把这些矩形的两个列作为区间存入一个临时数组中,之后把临时数组排序(也就是把区间排序),最后就遍历区间找出所有范围即可,也就是找出当前宽下所有的矩形高。【这里处理列就是扫描线问题,扫描线问题可以用前缀数组来处理】
  • 优化算法就是用线段树处理扫描线部分。【等整理了线段树再重写一下该题】
  • 该题难度不算特别大,考察的东西都比较直接,是扫描线的模板题。

代码实现:

  • 暴力解法代码实现如下:【逻辑来自下面参考内容中的链接】
    class Solution
    {
    public:int rectangleArea(vector<vector<int>>& rectangles){int MOD = 1e9+7;// 行的处理,用于求宽vector<int> vec; // 行数组for(auto& rect : rectangles) // 把 x1 和 x2 存入数组中vec.emplace_back(rect[0]), vec.emplace_back(rect[2]);sort(vec.begin(), vec.end());// 列的处理,用于求高,高的处理就是扫描线的处理long long ans = 0;for(int i = 1; i < vec.size(); ++i){int a = vec[i-1], b = vec[i];int len = b - a; // 宽if(len == 0) continue;vector<vector<int>> tmp;for(auto& rect : rectangles) // 列的区间if(rect[0] <= a and b <= rect[2]) tmp.push_back({rect[1], rect[3]});sort(tmp.begin(), tmp.end(), [&](const vector<int>& a, const vector<int>& b){return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];});long long cnt = 0, l = -1, r = -1; // 前一个区间for(auto& cur : tmp){if(cur[0] > r) // 没有重叠{cnt += r - l;l = cur[0], r = cur[1];}else if(cur[1] > r) // 重叠,更新区间的右边界r = cur[1];}cnt += r - l;ans += cnt * len;ans %= MOD;}return (int)ans;}
    };
    

参考内容:

  • 【宫水三叶】扫描线模板题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9139.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言函数递归调用

1、函数递归调用的定义 递归函数定义&#xff1a;一个函数在 自己的函数体内 调用自己&#xff1b;执行递归函数将反复调用其自身&#xff0c;每调用一次就有一个新层 #include<stdio.h> // 函数声明 void diguifunc(); int main() //主函数 {diguifunc(); //运行后…

常用的软件架构

MVC 架构 MVP 架构 MVVM 架构 网上的一些常用架构解释图:MVC架构MVP架构

Haproxy 透传IP配置方法及测试

Haproxy 透传IP配置方法1. 环境准备2. 测试准备2.1 启动Haproxy容器方法2.1.1 拉取官方haproxy镜像2.1.2 删除旧的容器2.1.3 编写haproxy配置2.1.4 运行配置检查2.1.5 启动容器2.1.6 更改配置2.2 Golang Server编写2.2.1 TCP Server2.2.2 HTTP Server2.3 客户端测试2.3.1 设置网…

关于VC++运行库报错

Microsoft Visual C&#xff08;简称Visual C、MSVC、VC或VC&#xff09;是微软公司的C开发工具&#xff0c;具有一体化开发环境&#xff0c;可提供编辑 C语言&#xff0c;C以及C/CLI等程式语言。 VC集成了便利的调试工具&#xff0c;特别是整合了微软Windows窗口操作系统应用程…

家用网络常识

目前家庭使用的网速一般 运营商 销售的宽带,会说 50M 100M 200M 300M 这个 100M 指的就是 100M bit/s,而我们都知道 8bit相当于一个字节,也就是1B,所以换算成字节,其实是 12.5M B/s,也就是12.5M,12.5兆换算关系 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB 1 TB = 102…

联邦学习开源框架方案选型

无知者&#xff1a;【联邦学习开源框架】FedLab - 加速FL算法验证 联邦学习开源框架FedLab相关 FATE 单位&#xff1a;微众银行 github: https://github.com/FederatedAI/FATE star&#xff1a;3.2k docs&#xff1a;https://github.com/FederatedAI/FATE/blob/master/doc…

电力系统中新型预测双二元变量机组组合问题(Matlab代码实现)

目录 1 概述 2 Matlab代码实现 3 参考文献 1 概述 高效求解大规模 SCUC 问题的关键在于削减其规模。文献[1]表明&#xff0c;安全约束机组组合问题中 大量的故障态安全约束是冗余且无效的&#xff0c;不会对SCUC 问题的最优解产生影响。因此&#xff0c;可以通过辨 识、删除…

为什么ArrayList的subList结果不能转换为ArrayList????

subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List。 让我们初始化一个例子:import java.util.ArrayList; import java.util.List;public class SubList_demo {public static void main(Strin…

OPTEE:CA-TA会话的创建(二)

前言 在上一篇我们知道TA是什么&#xff0c;以及为什么需要加载TA。这里来写写加载TA后&#xff0c;怎么CA和TA&#xff0c;TA和TA怎么建立会话&#xff0c;实现我们的功能的。 参考内容全部来自《手机安全和可信应用开发指南》&#xff0c;少有OPTEE书籍&#xff0c;感恩前辈…

牛客网-SQL专项训练15

①MySQL是一种(关系型)数据库管理系统。 关系型数据库的代表包括Oracle, Sql Server, MySQL。 ②小李在创建完一张数据表后,发现少创建了一列,此时需要修改表结构,应该用哪个语句进行操作?C 解析: 题目中说了需要修改表的结构, 故需要使用alter table 添加列: ALTER T…

大数据技术分享 - 话题挑战跳大开团

CSDN话题挑战赛第2期 参赛话题&#xff1a;大数据技术分享 大数据技术分享 - 话题挑战跳大开团 文章目录大数据技术分享 - 话题挑战跳大开团一、披挂上阵【老将出马】1. 历史战绩2. 再战江湖二、先手跳大【勇于开团】1. 个人经历2. Buff自取三、兵精粮足【底蕴深厚】1. 写作模…

QT串口助手-ZUA课设

QT串口助手成品展示QT全部程序构成zua.proserial.hmain.cppserial.cppserial.uiKeil全部程序构成main.cstm32f10x_conf.hstm32f10x_it.c5.stm32f10x_it.hbsp_usart.cbsp_led.cbsp_exit.cbsp_dht11.cbsp_delay.c介绍硬件野火F103指南者DHT11温湿度传感器QT全部程序构成QT设计的思…

虚拟机中centos扩展根目录空间

文章目录一、在vmware上为centos扩展存储二、在centos上扩充在进行yum安装软件时&#xff0c;由于空间不足一直提示“文件系统根目录上从磁盘空间不足”一、在vmware上为centos扩展存储 二、在centos上扩充 运行 df -h 查看容量情况&#xff0c;发现新扩展的空间并没有加载上。…

Babel 插件:30分钟从入门到实战

动手点关注 干货不迷路 &#x1f447;Babel 是一个 source to source&#xff08;源码到源码&#xff09;的 JavaScript 编译器&#xff0c;简单来说&#xff0c;你为 Babel 提供一些 JavaScript 代码&#xff0c;Babel 可以更改这些代码&#xff0c;然后返回给你新生成的代码。…

LeetCode程序员面试金典(第 6 版)上

目录 面试题 01.01. 判定字符是否唯一 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01.05. 一次编辑 面试题 01.06. 字符串压缩 面试题 01.07. 旋转矩阵 面试题 01.08. 零矩阵 面试题 01.09. 字符串轮转 面试题 02.01. 移除重复节点 面试题 02.02. 返回倒数第…

BI测试

关于BI测试 前言:由于之前做过一段时间大数据测试,故整理BI测试知识点以供学习。BI测试: BI是从数据接入、数据准备、数据分析、数据可视化到数bai据分发应用的一系列过程,目的是为了辅助企业高效决策。而报表虽然最终也实现了数据可视化,但是对于数据分析的维度、深度、颗…

【数据结构与算法】排序(下篇)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《数据结构与算法》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 排序⚽归并排序⚾递归实现⚾非递归实现⚽常见排序算法的复杂度和稳定性分析⚾稳定性⚾具体分…

docker安装mysql(单体)

docker安装mysql mac的m1芯片上不支持5.7版本的镜像&#xff0c;因此可以直接选择拉取8.0及之后的版本 docker pull mysql创建mysql的宿主机数据卷挂载的文件夹 # mysql的配置文件&#xff0c;注意conf.d文件夹必须要创建&#xff0c;否则启动容器的时候&#xff0c;数据卷 …

linux 锁-- atomic per_cpu

atomic引入背景 对于 SMP 系统中&#xff0c;在开启 preempt 情况下&#xff0c;对于公共资源&#xff0c;如果存在两个 task 来进行更改&#xff0c;这就面临临界区资源竞争问题&#xff0c;此时会产生意想不到的结果&#xff0c;这是不符合预期的&#xff0c;因此需要来进行…

nginx-nginx的文件服务器的配置

nginx的文件服务器的配置location /data {charset gbk,utf-8;autoindex on;autoindex_exact_size off;autoindex_localtime on;limit_rate_after 10m;alias D:;allow all; }访问文件路径xxx/data访问成功的返回界面