[刷题] 435 Non-overlapping Intervals
要求
- 贪心算法与动态规划的关系
- 给定一组区间,最少删除多少个区间,可以让这些区间之间互相不重叠
- 给定区间的起始点永远小于终止点
示例
- [[1,2],[2,3],[3,4],[1,3]], 返回1
- [[1,2],[1,2],[1,2]], 返回2
思路
- 等价为最多保留多少个区间
- 暴力:找出所有子区间的组合,判断不重叠((2^n)*n)
- 先排序,方便判断不重叠
- 具体实现类似最长上升子序列
- 选择区间的结尾很重要,结尾越小,留给后面的空间越大
实现
- 动态规划(n^2)
- dp[i]:使用intervals[0...i]的区间所能构成的最长不重叠区间序列

1 class Solution {
2 public:
3 int eraseOverlapIntervals(vector<vector<int>>& intervals) {
4
5 if(intervals.size() == 0)
6 return 0;
7
8 sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){
9 if(a[0] != b[0]) return a[0] < b[0];
10 return a[1] < b[1];
11 });
12
13 vector<int> dp(intervals.size(), 1);
14 for(int i = 1 ; i < intervals.size() ; i ++)
15 for(int j = 0 ; j < i ; j ++)
16 if(intervals[i][0] >= intervals[j][1])
17 dp[i] = max(dp[i], 1 + dp[j]);
18
19 return intervals.size() - dp.back();
20 }
21 };
- 贪心算法(n)
- 按照区间结尾排序,每次选择结尾最早的,且和前一个区间不重叠的区间
- 贪心选择性质:贪心算法为A,最优算法为O,A完全能替代O,且不影响求出最优解
- 若无法使用贪心算法,举出反例即可
- 证明正确性,可使用数学归纳法
- 某次选择的是[s(i),f(i)],其中f(i)是当前所有选择中结尾最早的
- 假设这个选择不是最优的,若最优解为k,则这个选择得到的解,最多为k-1
- 假设最优解在这一步选择[s(j),f(j)],其中f(j)>f(i)
- 显然可用[s(i),f(i)]替换[s(j),f(j)],而不影响后续的区间选择
- 即当选择[s(i),f(i)]时,也构成了大小为k的解,矛盾
- 此问题具有贪心选择性,可以用贪心算法得到最优解

1 class Solution {
2
3 public:
4 int eraseOverlapIntervals(vector<vector<int>>& intervals){
5
6 if(intervals.size() == 0)
7 return 0;
8
9 sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){
10 if(a[0] != b[0]) return a[0] < b[0];
11 return a[1] < b[1];
12 });
13
14 int res = 1;
15 int pre = 0;
16 for(int i = 1 ; i < intervals.size() ; i ++)
17 if(intervals[i][0] >= intervals[pre][1]){
18 pre = i;
19 res ++;
20 }
21 else if(intervals[i][1] < intervals[pre][1])
22 pre = i;
23
24 return intervals.size() - res;
25 }
26 };
应用
- 最小生成树
- 最短路径
[刷题] 435 Non-overlapping Intervals的更多相关文章
- 【leetcode刷题笔记】Merge Intervals
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...
- C#LeetCode刷题之#56-合并区间(Merge Intervals)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3676 访问. 给出一个区间的集合,请合并所有重叠的区间. 输入: ...
- 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个
376. Wiggle Subsequence 自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干 ...
- leetcode刷题指南
转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...
- lintcode 刷题 by python 总结(1)
博主之前在学习 python 的数据结构与算法的基础知识,用的是<problem-solving-with-algorithms-and-data-structure-using-python& ...
- LeetCode刷题191123
博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
随机推荐
- Kubernetes 实战 —— 05. 服务:让客户端发现 pod 并与之通信(下)
将服务暴露给外部客户端 P136 有以下三种方式可以在外部访问服务: 将服务的类型设置成 NodePort 将服务的类型设置为 LoadBalance 创建一个 Ingress 资源 使用 NodeP ...
- 热更新解决方案--xlua学习笔记
一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...
- CVE-2010-3333-office RTF栈溢出漏洞分析
0x00 前言 此漏洞是根据泉哥的<漏洞战争>来学习分析的,网上已有大量分析文章在此只是做一个独立的分析记录. 0x01 复现环境 操作系统-->windows7 x64 软件版本- ...
- TCP 和 UDP 协议简介
一.TCP TCP(Transmission Control Protocol),传输控制协议,对"传输.发送.通信"进行"控制"的协议,它充分地实现了数据传输 ...
- Vim快速使用教程
Vim Vim是从vi发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富. Vi/Vim的使用 基本上分为三种模式,分别是命令模式(commad mode),输入模式(Inse ...
- 【CTF】图片隐写术 · 修复被修改尺寸的PNG图片
前言 今天我们想来介绍一下关于图片隐写相关处理,以及修复被修改尺寸的PNG图片. 关于PNG图片的相关处理,是CTF Misc图片隐写术中极为基础的一项操作,笔者这里是想要提一些做题过程中发现的小技巧 ...
- mysql架构与存储引擎 (Myisam与Innodb)
mysql抽象架构:可以分为SQL Layer和Storage Engine Layer mysql的engine层是基于表的,不是基于库的,创建表的语句可以指定engine Mysql的架构 Mys ...
- Amazon EFS CSI 驱动程序 为eks 提供存储服务
官方文档:https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html
- new、delete、析构函数、自动类型转换
new 分配内存,返回指针 new 类型名T (初值列表) 功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值 结果值: 成功->T类型的指针,指向新分配的内存 失败->0(NU ...
- hdu1960 最小路径覆盖
题意: 给你明天的出租车订单,订单中包含每个人的起点和终点坐标,还有时间,如果一辆出租车想接一个乘客必须在每个订单前1分钟到达,也就是小于等于time-1,问你完成所有订单要最少多少量出租 ...