[刷题] 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的 ...
随机推荐
- PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642
PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...
- Python数据分析入门(六):Pandas的函数应用
apply和applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) p ...
- Spring Boot 轻量替代框架 Solon 1.3.20 发布
Solon 是一个微型的Java开发框架.项目2018年启动,参考过大量前人作品:内核0.1m的身材,超高的跑分,以及良好的使用体验.支持:RPC.REST API.MVC.WebSocket.Soc ...
- 一文简述JAVA内部类和异常
内部类和异常 内部类 在一个类的内部定义的一个类,例如,A类中定义了一个B类,则B类相对于A类就是内部类,而A类相对于B类就是外部类 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类 pub ...
- 数据库MySQL三
进阶4:常见函数 字节长度为12,一个汉字3个字节 8个字符 注意起始索引 1 -1 0 红色是记忆的 二.数学函数 当前日期包括时间 获取日期 获取时间 四.流程控制函数 案例 分组函数 单行函数: ...
- 22. VUE 插槽-详解
插槽 一直对插槽不理解,今天学习,并整理一下,希望日后可以灵活运用. (一)插槽内容 先简单来个例子,看一下插槽的租作用. 1.1 不使用插槽 父组件中: <div id="app&q ...
- 如何在 NET 程序万种死法中有效的生成 Dump (下)
一:背景 上一篇我们聊到了如何通过 procdump 抓取 cpu爆高 和 内存暴涨 两种情况,这一篇再聊聊如何去抓程序 挂死 和 意外退出. 二:程序挂死 1. 定义 程序挂死 简单的说就是程序没有 ...
- Day05_26_Overide_方法重写
Overide_方法重写 * 什么是方法重写(Overide)? - 方法重写也叫方法覆盖 ,重写是指子类对父类所允许访问的方法的实现过程进行重新编写, 返回值类型和形参都不能改变.即外壳不变,核心重 ...
- TypeScript 入门自学笔记 — 类型断言(二)
码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...
- Sublime插件安装和使用
Sublime插件安装和使用 插件安装的方式: 插件安装方式一:直接安装 下载插件安装包,然后把安装解压到packages目中,按成安装(菜单->首选项->浏览插件) 插件安装方法二:使用 ...