要求

  • 贪心算法与动态规划的关系
  • 给定一组区间,最少删除多少个区间,可以让这些区间之间互相不重叠
  • 给定区间的起始点永远小于终止点

示例

  • [[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的更多相关文章

  1. 【leetcode刷题笔记】Merge Intervals

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  2. C#LeetCode刷题之#56-合并区间(Merge Intervals)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3676 访问. 给出一个区间的集合,请合并所有重叠的区间. 输入: ...

  3. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  4. leetcode刷题指南

    转载自:http://blog.csdn.net/lnho2015/article/details/50962989 以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目 ...

  5. lintcode 刷题 by python 总结(1)

    博主之前在学习 python 的数据结构与算法的基础知识,用的是<problem-solving-with-algorithms-and-data-structure-using-python& ...

  6. LeetCode刷题191123

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 算法: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: ...

  7. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配   17.8% 困难 45 跳跃游戏 II   25.5% 困难 55 跳跃游戏   30.6% 中等 122 买卖股票的最佳时机 II C ...

  8. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  9. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

随机推荐

  1. js--如何实现继承?

    前言 学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继承则继承父类的实际的方法,js 中主要依靠原型链来实现继承,无法做接口继承. 学习 j ...

  2. 热更新应用--热补丁Hotfix学习笔记

    一.热补丁简介 热补丁主要是用于将纯C#工程在不重做的情况下通过打补丁的形式改造成具备lua热更新功能工程,主要是让原来脚本中Start函数和Update函数等函数代码块重定向到lua代码. 二.第一 ...

  3. Java学习笔记--文件IO

    简介 对于任何程序设计语言,输入和输出(Input\Output)都是系统非常核心的功能,程序运行需要数据,而数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备 ...

  4. 【2020.8.23NOIP模拟赛】失落

    [ 2020.8.23 N O I P 模 拟 赛 ] 失 落 [2020.8.23NOIP模拟赛]失落 [2020.8.23NOIP模拟赛]失落 题目描述 出题人心情很失落,于是他直接告诉你让你求出 ...

  5. JS基础学习第六天

    数组(Array) 数组也是一个对象,它和普通的对象一样,也是用来存储一些值的,不同的是普通对象是使用字符串作为属性名的,而数组使用数字作为索引来操作元素数组的存储性能比普通对象好,再开发中我们经常使 ...

  6. OO第四单元总结及学期总结

    目录 OO第四单元总结及学期总结 第四单元三次作业架构设计 第十三次作业 第十四次作业 第十五次作业 四个单元中架构设计及OO方法理解的演进 第一单元 第二单元 第三单元 第四单元 四个单元中测试理解 ...

  7. 如何以源码形式运行Nacos Server

    官方标准运行方式 下载解压可运行包 curl -O https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3. ...

  8. Day09_42_Set集合_HashSet

    集合之HashSet * HashSet - HashSet无序不可重复,HashSet底层实际上是一个HashMap,HashMap底层采用了Hash表数据结构. - 哈希表又叫做散列表,哈希表底层 ...

  9. [Java] 数据类型, 变量, 运算符, 表达式

    title: [Java] 变量与表达式 你已经学会输出 Hello world 了, 那么现在, 我们来学习关于变量的知识 基本数据类型 在 Java 中, 有 8 种基本的数据类型: 名称 描述 ...

  10. B/S与C/S架构的区别

    C/S架构优点:1)界面比较丰富2)安全性高3)实现的功能更多,可以实现更复杂的业务4)客户端可以处理部分业务,分担服务器端压力缺点:1)需要开发独立的客户端软件,开发成本高2)需要安装独立的客户端软 ...