[刷题] 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的 ...
随机推荐
- 博文推荐|多图详解 Apache Pulsar 消息存储模型
关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...
- 敏捷史话(十三):我被 Facebook 解雇了——Kent Beck
2011年,Kent Beck 加入了 Facebook .那时候的他已年过半百,几十年的经验让他自认为非常了解软件行业.在 Facebook 的新手训练营期间,Kent 开始意识到,Facebook ...
- [BFS]最优乘车
最优乘车 题目描述 HH 城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士站出发,依 ...
- 下载kaggle数据集的小妙招
kaggle是很多数据分析和机器学习初学者非常喜爱的数据科学竞赛平台. 这个平台上有很多接近现实业务场景的数据集,非常适合练手. 今天向大家推荐一个下载kaggle数据集的小工具--kaggleAPI ...
- 【笔记】《Redis设计与实现》chapter2 简单动态字符串
------------恢复内容开始------------ 2.1 SDS的定义 struct sdshdr{ // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度(不含'\0 ...
- 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)
1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...
- 简单的介绍一下Java设计模式:解释器模式
目录 定义 意图 主要解决问题 优缺点 结构 示例 适用情况 定义 解释器模式是类的行为型模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,客户端可以使用这个解释器来 ...
- 07_利用pytorch的nn工具箱实现LeNet网络
07_利用pytorch的nn工具箱实现LeNet网络 目录 一.引言 二.定义网络 三.损失函数 四.优化器 五.数据加载和预处理 六.Hub模块简介 七.总结 pytorch完整教程目录:http ...
- 【接口设计】用户积分排行榜功能-Redis实现
一.排行榜功能简介 排行榜功能是一个很普遍的需求.使用 Redis 中有序集合(SortedSet)的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如交通数据流中的路口/路段的车流量 ...
- POJ 2762 单连通图
题意: 给你一个有向图,问你这个图是不是单连通图,单连通就是任意两点之间至少存在一条可达路径. 思路: 先强连通所点,重新建图,此时的图不存在环,然后我们在看看是否存在一条路径可以 ...