要求

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

示例

  • [[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. 1 class Solution {
  2. 2 public:
  3. 3 int eraseOverlapIntervals(vector<vector<int>>& intervals) {
  4. 4
  5. 5 if(intervals.size() == 0)
  6. 6 return 0;
  7. 7
  8. 8 sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){
  9. 9 if(a[0] != b[0]) return a[0] < b[0];
  10. 10 return a[1] < b[1];
  11. 11 });
  12. 12
  13. 13 vector<int> dp(intervals.size(), 1);
  14. 14 for(int i = 1 ; i < intervals.size() ; i ++)
  15. 15 for(int j = 0 ; j < i ; j ++)
  16. 16 if(intervals[i][0] >= intervals[j][1])
  17. 17 dp[i] = max(dp[i], 1 + dp[j]);
  18. 18
  19. 19 return intervals.size() - dp.back();
  20. 20 }
  21. 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. 1 class Solution {
  2. 2
  3. 3 public:
  4. 4 int eraseOverlapIntervals(vector<vector<int>>& intervals){
  5. 5
  6. 6 if(intervals.size() == 0)
  7. 7 return 0;
  8. 8
  9. 9 sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){
  10. 10 if(a[0] != b[0]) return a[0] < b[0];
  11. 11 return a[1] < b[1];
  12. 12 });
  13. 13
  14. 14 int res = 1;
  15. 15 int pre = 0;
  16. 16 for(int i = 1 ; i < intervals.size() ; i ++)
  17. 17 if(intervals[i][0] >= intervals[pre][1]){
  18. 18 pre = i;
  19. 19 res ++;
  20. 20 }
  21. 21 else if(intervals[i][1] < intervals[pre][1])
  22. 22 pre = i;
  23. 23
  24. 24 return intervals.size() - res;
  25. 25 }
  26. 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. SpringCloud+Nacos实现服务配置中心(Hoxton版本)

    关于 Nacos Spring Cloud 的详细文档请参看:Nacos Config和Nacos Discovery. 通过 Nacos Server 和 spring-cloud-starter- ...

  2. ionic3 清除navpush的堆栈 (android真机返回键bug)

    清除navpush的堆栈可以使用 方法一:ionic3文档 this.navCtrl.popToRoot(); //直接返回根组件 方法二: push 后再删除之前页面即可. this.navCtrl ...

  3. 什么是 Ansible - 使用 Ansible 进行配置管理

    [注]本文译自:https://www.edureka.co/blog/what-is-ansible/   Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...

  4. 【源码解析】- ArrayList源码解析,绝对详细

    ArrayList源码解析 简介 ArrayList是Java集合框架中非常常用的一种数据结构.继承自AbstractList,实现了List接口.底层基于数组来实现动态容量大小的控制,允许null值 ...

  5. Kafka核心技术与实战,分布式的高性能消息引擎服务

    Kafka是LinkedIn开发并开源的一套分布式的高性能消息引擎服务,是大数据时代数据管道技术的首选. 如今的Kafka集消息系统.存储系统和流式处理平台于一身,并作为连接着各种业务前台和数据后台的 ...

  6. hbuilderX打包苹果证书的申请方法

    现在uniapp越来越火,hbuilderX和apicloud这些工具使用html+js语言就可以开发强大的app,大大降低了app开发的技术门槛. hbuilderX或apicloud在打包ios应 ...

  7. 【笔记】《算法竞赛入门》习题7-6 UVa12113_重叠的正方形

    title: 习题7-6 UVa12113_重叠的正方形 date: 2021-01-31 19:08:00 categories: 算法竞赛入门 tags: 数据结构 算法 UVa <算法竞赛 ...

  8. Window、Ubuntu传输文件到阿里云服务器

    Ubuntu传输文件到阿里云服务器 scp -r file(ubuntu的文件) root(用户名)@xx.xx.xx.xx(公网ip):/home/(目标文件夹) Window传输文件到阿里云服务器 ...

  9. Python中的多进程、多线程和协程

    本文中的内容来自我的笔记.撰写过程中参考了胡俊峰老师<Python程序设计与数据科学导论>课程的内容. 并发处理:多进程和多线程 前置 概念: 并发:一段时间内同时推进多个任务,但不一定要 ...

  10. Day17_100_IO_FileWriter文件字符输入流

    FileWriter文件字符输入流 继承结构 Java.lang.Object - java.io.Writer; 抽象类 java.io.OutputStreamWriter; <转换流: 将 ...