【贪心 决策包容性 】757. 设置交集大小至少为2

本文涉及知识点

贪心 决策包容性

LeetCode757. 设置交集大小至少为2

给你一个二维整数数组 intervals ,其中 intervals[i] = [starti, endi] 表示从 starti 到 endi 的所有整数,包括 starti 和 endi 。
包含集合 是一个名为 nums 的数组,并满足 intervals 中的每个区间都 至少 有 两个 整数在 nums 中。
例如,如果 intervals = [[1,3], [3,7], [8,9]] ,那么 [1,2,4,7,8,9] 和 [2,3,4,8,9] 都符合 包含集合 的定义。返回包含集合可能的最小大小。
示例 1:
输入:intervals = [[1,3],[3,7],[8,9]]
输出:5
解释:nums = [2, 3, 4, 8, 9].
可以证明不存在元素数量为 4 的包含集合。
示例 2:
输入:intervals = [[1,3],[1,4],[2,5],[3,5]]
输出:3
解释:nums = [2, 3, 4].
可以证明不存在元素数量为 2 的包含集合。
示例 3:
输入:intervals = [[1,2],[2,3],[2,4],[4,5]]
输出:5
解释:nums = [1, 2, 3, 4, 5].
可以证明不存在元素数量为 4 的包含集合。
提示:
1 <= intervals.length <= 3000
intervals[i].length == 2
0 <= starti < endi <= 108

决策包容性

令intervals[i1]的end最小。假定其在某个最优解包括的数为x1,x2。我们将x1和x2换成endi1和endi1-1也必定是最优解。
对于 ∀ \forall i 包括x2,那说明begini <= x2 <=endi 。由于 endi1 >=x2 且endi1<=endi。故endi1也包括。
对于 ∀ \forall i 如果包括x1和x2,x1 < x2 <=endi ,故endi1-1 <= endi ,endi1-1 >= x1 。即endi1-1也包括。
故:
setHas 记录已有数字。
按end升序处理,如果setHas包括两个数字,则忽略。
如果包括一个数字,将endi加入。
如果包括0个数字,将endi和endi-1也加入。

cnt=2
如何判断setHas需要多少个数字
it = setHas.lower(begin);
if( it合法&& ⋆ \star it <= end ){
cnt–;
it++;
如果合法且 ⋆ \star it <= end ,再–。
时间复杂度:O(nlogn) 二分查找的时间复杂度O(logn)。

错误

{1,3}{3,7},{5,7}
{5,7}时试图 增加7,但7已经存在。
当end相等的时候begin大的再前面,或end相等时,忽略begin小的。
当setHas有0个数时,自然不包括endi和endi-1。
有一个数时:
如果不存在相等的endi,则setHas一定不包括endi。
如果相等的endi,begini大的在前。 当前一定包括两个数,无需处理。

代码

核心代码

class Solution {
public:int intersectionSizeTwo(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), [&](vector<int>& v1, vector<int>& v2) {return (v1[1] < v2[1])||(( v1[1]== v2[1])&&(v1[0] > v2[0])); });set<int> setHas;for (const auto& v : intervals) {auto it = setHas.lower_bound(v[0]);int cnt = 2;if ((setHas.end() != it) && (*it <= v[1])) {cnt--;it++;if ((setHas.end() != it) && (*it <= v[1])) {cnt--;}}if (cnt >=1 ) {setHas.emplace(v[1]);}if (2 == cnt) {setHas.emplace(v[1]-1);}}return setHas.size();}
};

单元测试


template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}
void AssertEx( double t1,  double t2)
{auto str = std::to_wstring(t1) + std::wstring(1,32) + std::to_wstring(t2);Assert::IsTrue(abs(t1 - t2) < 1e-5,str.c_str() );
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{vector<vector<int>> intervals;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){intervals = { {1,3},{3,7},{8,9} };auto res = Solution().intersectionSizeTwo(intervals);AssertEx(5, res);}TEST_METHOD(TestMethod01){intervals = { {1,3},{1,4},{2,5},{3,5} };auto res = Solution().intersectionSizeTwo(intervals);AssertEx(3, res);}TEST_METHOD(TestMethod02){intervals = { {1,2},{2,3},{2,4},{4,5} };auto res = Solution().intersectionSizeTwo(intervals);AssertEx(5, res);}TEST_METHOD(TestMethod03){intervals = { {1,3},{3,7},{5,7},{7,8} };auto res = Solution().intersectionSizeTwo(intervals);AssertEx(5, res);}};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

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

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Quasar V2.16.4 新版发布,基于 Vue 3 的前端开发框架,一套代码发布到多端

Quasar 又发布新版本了&#xff0c;性能优秀的 Vue 组件开发框架&#xff0c;时隔3年再次推荐给大家。 早在2021年&#xff0c;我就写了一篇简单的文章向大家推荐了 Quasar 这款 Vue.js 开发框架&#xff0c;如今3年过去了&#xff0c;Quasar 发展得很好&#xff0c;更新频率依…

H5开发有哪些技巧?

随着现代社会的飞速发展&#xff0c;网页开发已经从传统的HTML、CSS、JavaScript往H5发展。H5也称为HTML5&#xff0c;可以理解为是HTML的升级版&#xff0c;具有更加优秀的性能、更加完善的功能和更加多样的体验。因其灵活性和跨平台特性&#xff0c;成为了各类移动应用和网页…

数学建模学习(128):使用Python结合CILOS与熵法的多准则决策权重确定

本文介绍方法为:结合CILOS与熵法的多准则决策权重,请理解为主,代码可以当作模板使用。 文章目录 1 引言2 问题背景2.1. 熵法 (Entropy Method)2.2 准则影响损失法 (CILOS Method)2.3 Python代码实现2.4 结果的决策指导意义2.4 结论参考文献1 引言 多准则决策(Multi-Criter…

面试常问! transformer中dk的大小,以及为什么设成这样,维度,原文分析。

目录&#xff1a; 原文 &#xff1a;翻译&#xff1a;流程&#xff1a;原因&#xff1a; 原文(多头注意力部分) &#xff1a; 李沐b站论文精读 论文网盘下载&#xff1a;链接 提取码: vm3d 翻译&#xff1a; 在这项工作中&#xff0c;我们采用了 h8 个并行注意力层&#xff…

flutter之image_picker上传图片

原文地址 image_picker 安装 image_picker: ^1.1.2使用 我们获取到上传的照片后,将其转为base64编码的格式,方便后续使用 // source: 接收两种模式,相册和拍照final pickedImage =await

No module named ‘comtypes‘

No module named comtypes 报错解释&#xff1a; 这个错误表明Python解释器无法找到名为comtypes的模块。comtypes是一个Python库&#xff0c;用于处理COM类型库&#xff0c;特别是用于与Windows COM组件交互。如果你的代码或者你尝试运行的程序需要使用comtypes库&#xff0…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议&#xff0c;该协议可以有效防止远程管理过程中的信息泄漏&#xff0c;是西安传输数据加密&#xff0c;能够防止DNS和IP欺骗&#xff0c;传输数据压缩&#xff0c;加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段&#xff0c;该协…

线上剧本杀小程序,线上游戏新体验

剧本杀作为当下热门的社交型游戏方式&#xff0c;成为了大众社交娱乐的选择&#xff0c;为大众带来新的游戏体验。在数字化发展时期&#xff0c;线上剧本杀为大众带来了新鲜的游戏体验&#xff0c;它打破了时间空间限制&#xff0c;让玩家在手机上体验虚拟游戏&#xff0c;通过…

Python的可选导入 optional import

Python的可选导入&#xff1a;提升代码可读性与简洁性的利器 在Python编程中&#xff0c;我们常常会使用到各种库和模块。为了方便使用这些库和模块&#xff0c;我们需要通过导入语句将其引入到我们的程序中。然而&#xff0c;随着项目规模的增大&#xff0c;导入语句可能会变…

Oracle发邮件时SMTP服务器配置方法与步骤?

Oracle发邮件功能如何配置&#xff1f;如何优化Oracle发信性能&#xff1f; 为了实现自动化报告和通知&#xff0c;Oracle发邮件功能变得尤为重要。通过配置SMTP服务器&#xff0c;Oracle可以轻松地发送电子邮件。AokSend将详细介绍如何配置Oracle发邮件时的SMTP服务器&#x…

音频处理新纪元:深入探索PyTorch的torchaudio

音频处理新纪元&#xff1a;深入探索PyTorch的torchaudio 在深度学习领域&#xff0c;音频数据的处理和分析正变得越来越重要。PyTorch&#xff0c;作为一个强大的机器学习库&#xff0c;通过其torchaudio扩展包&#xff0c;提供了一套完整的工具来处理和分析音频数据。本文将…

IDEA 编译项目时卡在Parsing java,最终报out of memory

今天在项目运行的时候莫名其妙报错&#xff1a; 报错内容&#xff1a; java.lang.OutOfMemoryError: GC overhead limit exceeded原因&#xff1a; 通常是因为堆内存太小&#xff0c;无法有效管理正在创建和销毁的对象。 解决方法&#xff1a; 在 IDEA 的安装目录下找到 bi…

ABB巨资收购一家电气龙头,为当年卖给日立电气业务回血

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 战略扩张&#xff1a;ABB携SEAM集团深耕电气服务市场 在电气服务领域&#xff0c;ABB再次展现了其强大的市场扩张能力。近日&#xff0c;ABB宣布…

实现uniapp h5 网页跳转微信小程序

文章目录 前言一、实现uniapp网页跳转微信小程序二、具体步骤1.获取小程序的token2.获取小程序跳转链接3.总的示例模板 总结 前言 最近的项目中有用到&#xff0c;算是踩坑后的记录吧 微信官方文档参考&#xff1a;获取token 微信官方文档参考&#xff1a;获取url scheme 提示…

C# 实现WebScoket客户端

C# 实现WebScoket客户端 含登录授权功能 using System; using System.Text; using System.Threading; using System.Collections.Concurrent; using System.Net.WebSockets; using Newtonsoft.Json.Linq; using System.Net; using System.IO;using MultiCore.ViewModel;namesp…

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆&#xff0c;测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。括号匹配。 二、…

Windows Edge浏览器对Web Authentication API的支持分析与实践应用

随着网络技术的发展&#xff0c;Web安全认证方式也在不断进步。Web Authentication API&#xff08;通常称为WebAuthn&#xff09;是一个现代的Web标准&#xff0c;旨在提供更安全、更便捷的认证机制。它支持多种认证方式&#xff0c;包括生物识别技术、硬件令牌和手机认证等。…

Pycharm module ‘serial‘ has no attribute ‘Serial‘

已经pip install serial 已经提示安装成功了&#xff0c;提示没有Serial的属性&#xff0c;经过查询 &#xff0c;发现安装的模块不对&#xff0c;应该安装pyserial模块。 解决步骤 第一步&#xff1a;卸载serial pip uninstall serial 第二步&#xff1a;安装pyserial pip u…

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/19 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为单选&#xff0c;自我评价题&#xff0c;编程题 单选和自我评价这里不再介绍&#xff0c;4399的编程题一如既往地抽象&#xff…