C++算法:完美矩形

news2024/11/19 17:27:21

题目

给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。
如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。
示例 1:
输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]
输出:true
解释:5 个矩形一起可以精确地覆盖一个矩形区域。
示例 2:
输入:rectangles = [[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]
输出:false
解释:两个矩形之间有间隔,无法覆盖成一个矩形。
示例 3:
输入:rectangles = [[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]
输出:false
解释:因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。
参数范围
1 <= rectangles.length <= 2 * 104
rectangles[i].length == 4
-105 <= xi, yi, ai, bi <= 105

2023年6月版

class Solution {
public:
bool isRectangleCover(vector<vector>& rectangles) {
int iMaxX = 0, iMaxY = 0;
{
vector rectMax = rectangles[0];
long long llTotalArea = 0;
for (auto& v : rectangles)
{
if (v[0] > v[2])
{
swap(v[0], v[2]);
}
if (v[1] > v[3])
{
swap(v[1], v[3]);
}
MinSelf(&rectMax[0], v[0]);
MinSelf(&rectMax[1], v[1]);
MaxSelf(&rectMax[2], v[2]);
MaxSelf(&rectMax[3], v[3]);
long long llWidth = v[2] - v[0];
llTotalArea += llWidth * (v[3] - v[1]);
}
//总面积必须和小矩形面积之和相等
if (llTotalArea != (long long)(rectMax[2] - rectMax[0])*(rectMax[3] - rectMax[1]))
{
return false;
}
for (auto& v : rectangles)
{
v[0] -= rectMax[0];
v[1] -= rectMax[1];
v[2] -= rectMax[0];
v[3] -= rectMax[1];
}
iMaxX = rectMax[2] - rectMax[0];
iMaxY = rectMax[3] - rectMax[1];
}
std::map<std::pair<int, int>, int> mPointNums;
for (auto& v : rectangles)
{
mPointNums[{v[0], v[1]}]++;
mPointNums[{v[0], v[3]}]++;
mPointNums[{v[2], v[1]}]++;
mPointNums[{v[2], v[3]}]++;
}
std::set<std::pair<int, int>> setRang;
setRang.insert(make_pair(0, 0));
setRang.insert(make_pair(0, iMaxY));
setRang.insert(make_pair(iMaxX, 0));
setRang.insert(make_pair(iMaxX, iMaxY));
for (const auto& it : mPointNums)
{
if (setRang.count(it.first))
{
if (1 != it.second)
{
return false;
}
continue;
}
if ((2 != it.second) && (4 != it.second))
{
return false;
}
}
return true;
}
};

2023年8月版

class Solution {
public:
bool isRectangleCover(vector<vector>& rectangles) {
vector vRange = rectangles.front();
std::unordered_map<long long, vector> mMaskNum;
for (const auto& v : rectangles)
{
vRange[0] = min(vRange[0],v[0]);
vRange[1] = min(vRange[1], v[1]);
vRange[2] = max(vRange[2], v[2]);
vRange[3] = max(vRange[3], v[3]);
mMaskNum[Mask(v[0], v[1])].emplace_back(0);//左下
mMaskNum[Mask(v[0], v[3])].emplace_back(1);//左上
mMaskNum[Mask(v[2], v[1])].emplace_back(1);//右下
mMaskNum[Mask(v[2], v[3])].emplace_back(3);//右上
}
vector vMaskRange;
vMaskRange.emplace_back(Mask(vRange[0], vRange[1]));
vMaskRange.emplace_back(Mask(vRange[0], vRange[3]));
vMaskRange.emplace_back(Mask(vRange[2], vRange[1]));
vMaskRange.emplace_back(Mask(vRange[2], vRange[3]));
for (const auto mask : vMaskRange)
{
if (1 != mMaskNum[mask].size())
{
return false;
}
mMaskNum.erase(mask);
}
for ( auto& it : mMaskNum)
{
auto& v = it.second;
if ((2 != it.second.size())&& (4 != it.second.size()))
{
return false;
}
std::sort(it.second.begin(), it.second.end());
bool bVilid = (0 == v[0]) && (3 == v.back());
if (2 == it.second.size())
{
if (v[0] == v[1])
{
return false;
}
bVilid = (v[0]/2 == v[1]/2) || (v[0]%2 == v[1]%2);
}
if (!bVilid)
{
return false;
}
}
return true;
}
long long Mask(int x, int y)
{
x += 100 * 1000;
y += 100 * 1000;
return (long long)x * 1000 * 1000 + y;
}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

洒家想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言基础篇3:函数

1 函数简介 C源程序是由函数组成的&#xff0c;一个程序往往由多个函数组成&#xff0c;函数是程序实现模块化变成的基本的单元&#xff0c;一般是为了完成某一个特定的功能&#xff0c;相当于其他语言中的子程序。一个较大程序的各项功能都是由各个子程序共同完成的&#xff0…

【Seata源码学习 】 AT模式 第一阶段 @GlobalTransaction的扫描

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制&#xff0c;在应用上下文启动时&#xff0c;会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…

Zabbix SNMPv3

一、Snmpv3简述 SNMPv3是Simple Network Management Protocol version 3&#xff08;简单网络管理协议第三版&#xff09;的缩写。它是一种网络管理协议&#xff0c;用于监控和管理网络中的设备、系统和应用程序。 相对于之前的版本&#xff0c;SNMPv3具有更强的安全性和扩展…

NGINX三种虚拟主机的配置

基于IP的配置 首先在原本基础上增加两个IP地址 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.140 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.150 [rootlocalhost conf.d]# nmcli connection u…

SharePoint 是什么

SharePoint 平台使您能够以在线方式和本地方式轻松地管理和协调业务数据。因为其灵活性和易使用性&#xff0c;公司可以快速采用SharePoint来管理其业务数据。 SharePoint Microsoft 365 一种基于云的服务&#xff0c;由 Microsoft 托管&#xff0c;适用于各种规模的企业。 任何…

vue2 数字软键盘 封装 可拖动 使用简单

1、效果图 2、使用方式 <Keyboard v-if"show" close"show false" :inputDom"$refs.input" /> 封装的数字键盘 Keyboard.vue 组件代码 <template><divclass"keyboard"ref"keyboard":style"{ left: …

CS224W6.2——深度学习基础

在本文中&#xff0c;我们回顾了深度学习的概念和技术&#xff0c;这些概念和技术对理解图神经网络至关重要。从将机器学习表述为优化问题开始&#xff0c;介绍了目标函数、梯度下降、非线性和反向传播的概念。 文章目录 1. 大纲2. 优化问题2.1 举例损失函数 3. 如何优化目标函…

matlab Silink PID 手动调参

&#xff08;业余&#xff09;PID即比例积分微分&#xff0c;它将给定值r(t)与实际输出值y(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合形成控制量&#xff0c;对被控对象进行控制。我们先用matlab Silink弄一个简易的PID例子&#xff1a; 中间三条就是比例&#xff0c;积…

【Python】一篇带你掌握数据容器之列表

目录 前言&#xff1a; 一、列表 1.列表的定义 2.列表的下标索引 3.列表的常用操作 &#xff08;1&#xff09;index方法&#xff1a;查找某元素的下标 (2)修改特定位置下标的元素 &#xff08;3&#xff09;insert&#xff08;下标&#xff0c;元素&#xff09;方法&a…

C/C++调试工具 - gdb详解

C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…

Linux组调度

为什么引入组调度可以参考这篇文章的讨论。核心原因是基础的调度算法都是基于任务的&#xff0c;如果用户A有10个任务&#xff0c;用户B只有1个任务&#xff0c;假设这些任务的优先级都相同&#xff0c;那么用户A得到的CPU时间将是用户B的10倍&#xff0c;这样从任务的角度看虽…

Mac Qt 5.13.2无法加载文件

在Mac OS 14.0系统上&#xff0c;离线安装了Qt5.13.2&#xff0c;但是新建一个工程&#xff0c;却无法正常使用&#xff0c;只能加载出pro文件&#xff0c;其他文件都加载不出来&#xff0c;提示错误&#xff1a;Project ERROR: failed to parse default search paths from com…

手机号验证码登录

登录入口 1.app 正常登录入口 2.app 网页登录&#xff0c;比如分享直播卡片时&#xff0c;进入直播间需要先进行登录 3.pc 登录 一&#xff0c;app常见的登录方式 1.手机号验证码登录 2.用户名密码登录 3.一键登录 二&#xff0c;手机验证码登录示意图 三&#xff0c;流程 0.登…

No178.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

已解决:java.net.BindException: 地址已在使用

解决zookeeper报错&#xff1a;java.net.BindException: 地址已在使用&#xff0c;是因为端口被占用。显示Starting zookeeper ... STARTED&#xff0c;jps没有QuorumPeerMain进程。 问题截图&#xff1a; 看似Starting zookeeper ... STARTED&#xff0c;实则集群并没有启动…

Linux 程序开发流程 / 基本开发工具 / Vim / GCC工具链 / Make 工具 / Makefile 模板

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…

华为ensp:rip宣告

ip全部配置好 R1 进入r1视图模式 rip network 192.168.1.0 network 1.0.0.0 R2 进入r2视图模式 rip network 192.168.2.0 network 1.0.0.0 这样就完成了宣告 display ip routing-table 查看路由表

Java基础——数组(一维数组与二维数组)

文章目录 一维数组声明初始化与赋值内存图解 二维数组声明初始化与赋值内存图解 数组练习 数组是多个相同类型的数据按一定顺序排列的集合。 说明&#xff1a; 数组是引用数据类型&#xff0c;数组的元素是同一类型的任何数据类型&#xff0c;包括基本数据类型和引用数据类型…

基于YOLOv8的输电线路异物识别算法应用

基于 YOLOv8 的输电线路异物识别算法应用 输电线路作为电力系统的重要一环&#xff0c;保证其安全稳定运行是十分必要的。由于长期暴露于室外&#xff0c;线路所面临的不安全因素繁多&#xff0c;异物入侵便是其中之一。异物可能会引起线路短路甚至诱发火灾&#xff0c;因此要加…

使用3D Touch,让你左右逢源,操作更自然

本文介绍了如何在苹果设备上使用3D Touch&#xff0c;以及哪些应用程序支持该工具。3D Touch在Apple Watch上也称为Force Touch&#xff0c;在iPhone XR上也称为Haptic Touch。 如何改变3D触摸的灵敏度 按照以下步骤调整3D Touch的灵敏度&#xff1a; 1、打开“设置”应用程…