[刷题] 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的 ...
随机推荐
- Java学习之数组的简单用法
•概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...
- go每日一库 [home-dir] 获取用户主目录
关于我 我的博客|文章首发 顾名思义,go-homedir用来获取用户的主目录.实际上,通过使用标准库os/user我们也可以得到内容,使用以下方式 标准库使用 package main import ...
- 【JVM进阶之路】十:JVM调优总结
1.调优原则 JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹. 比较认可廖雪峰老师的观点,要认识到JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的 ...
- 【Python学习笔记】-虚拟环境virtualenv
在开发python应用程序的时候,系统安装的python3只有一个版本:3.4.所有的第三方的包都回被pip安装到python3的site-packages目录下. 如果我们要要同时开发多个应用程序, ...
- JavaWeb 补充(Filter&Listener)
目录 Filter:过滤器 Listener:监听器 Filter:过滤器 1. 概念: * 生活中的过滤器:净水器,空气净化器,土匪. * web中的过滤器:当访问服务器的资源时,过 ...
- 浅入Kubernetes(7):应用部署实例,Deployment、Service、ReplicaSet
目录 Deployment 创建 Deployment kubectl apply/create 网络端口映射和更新 Deployment ReplicaSet 在本文之前,你需要阅读: 尝试 kub ...
- 18. VUE created 方法作用
一般可以在created函数中调用ajax获取页面初始化所需的数据. 实例的生命周期: 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer ...
- RPC理论介绍
目录 RPC概述 RPC是什么 和本地调用有什么区别 RPC模式 RPC的三个过程 为什么要使用RPC RPC和其他协议的区别 RPC使用场景 RPC的流程 RPC核心概念术语 RPC协议 RPC框架 ...
- UI自动化测试框架:关键字驱动+数据驱动
1. 关键字驱动框架简介 2. 工程结构说明 3. 工程代码实现 action 包 page_action.py business_process 包 case_process.py data_so ...
- 以 DEBUG 方式深入理解线程的底层运行原理
说到线程的底层运行原理,想必各位也应该知道我们今天不可避免的要讲到 JVM 了.其实大家明白了 Java 的运行时数据区域,也就明白了线程的底层原理,不过把这些东西明明白白写在纸面上的,网络上的文章并 ...