题目选自Leetcode56

思路
大家应该都感觉到了,此题一定要排序,那么按照左边界排序,还是右边界排序呢?

都可以!排序之后就是贪心思想了~~

题目

给出一个区间的集合,请合并所有重叠的区间。

示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

详细解题思路:

那么我按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。

局部最优可以推出全局最优,找不出反例,试试贪心。

那有同学问了,本来不就应该合并最大右边界么,这和贪心有啥关系?

有时候贪心就是常识!哈哈

按照左边界从小到大排序之后,如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]左边界 < intervals[i - 1]右边界,则一定有重复,因为intervals[i]的左边界一定是大于等于intervals[i - 1]的左边界。

即:intervals[i]的左边界在intervals[i - 1]左边界和右边界的范围内,那么一定有重复!

这么说有点抽象,看图:(「注意图中区间都是按照左边界排序之后了」)

算法

我们用数组 merged 存储最终的答案。

首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:

如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;

否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。

解题代码:

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size() == 0) return {};sort(intervals.begin(),intervals.end());vector<vector<int>> merged;for(int i=0;i<intervals.size();i++){int L = intervals[i][0]; int R = intervals[i][1];if(!merged.size() || merged.back()[1] < L)merged.push_back({L,R});else merged.back()[1] = max(merged.back()[1],R);}return merged;}
};

如果这个看不懂,那就看这个 简单易懂的低配版本!

class Solution {
public:static bool cmp(vector<int> a,vector<int> b){ //自定义排序要求return a[0] < b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0) return result;sort(intervals.begin(), intervals.end(),cmp);result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) { //最右端点≥当前左端点则可以合并区间result.back()[1] = max(result.back()[1], intervals[i][1]);} else { //否则这个就是新的区间,直接放入数组中result.push_back(intervals[i]);}}return result;}
};

为啥低配呢? 因为效率属实有点低 QAQ

贪心算法——合并区间(Leetcode 56)相关推荐

  1. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法

    LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...

  2. 贪心算法无重叠区间c语言,贪心算法之区间问题.md

    --- title: 贪心算法之区间问题 tags: - Leetcode categories: - Leetcode author: 四叶草 top: false abbrlink: 26230 ...

  3. 贪心算法之区间取点问题

    贪心算法之区间取点问题 题目描述: Assume the coasting is an infinite straight line. Land is in one side of coasting, ...

  4. 贪心算法:区间调度-射气球问题

    贪心算法:区间调度问题 母问题描述: 在一个会场中,安排活动,给定所有活动的开始时间与结束时间的集合放在数组nums[n][2]中.求问最多能安排几场活动,使每场活动之间的时间不冲突. public ...

  5. 贪心算法【区间调度】【背包问题】【集合覆盖】【旅行商问题】【哈夫曼构造价值树】

    贪心算法  在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解.  贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择, ...

  6. 2.合并区间(LeetCode第56题)

    一.题目介绍 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] .请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组 ...

  7. 贪心——无重叠区间(Leetcode 435)

    题目选自Leetcode 435 按照右边界排序,就要从左向右遍历,因为右边界越小越好,只要右边界越小,留给下一个区间的空间就越大,所以从左向右遍历,优先选右边界小的. 我来按照右边界排序,从左向右记 ...

  8. c语言贪心算法合并箭,贪心算法:用最少数量的箭引爆气球

    ❝ 通知:一些录友表示经常看不到每天上午的文章,现在公众号已经不按照发送时间推荐了,而是根据一些规则乱序推送,所以可能关注了「代码随想录」也一直看不到文章,建议把「代码随想录」设置星标哈,设置星标之后 ...

  9. NYOJ 6 喷水装置(一) 贪心算法 之 区间覆盖问题

    喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为 ...

最新文章

  1. Print all attributes and values in a Javascript Object
  2. 怎么改善现有网站为xhtml+CSS
  3. 推荐一个Android开源项目-AisenWeiBo
  4. mysql 存储过程 主键_存储过程生成主键
  5. 如何才能成为java高级程序员?
  6. org.apache.flink.client.program.ProgramInvocationException: Job failed
  7. 【渝粤题库】国家开放大学2021春2223物业管理财税基础题目
  8. dw中HTML修改背景图片,dreamweaver将一个图片设定背景,用代码怎么写?
  9. Centos6.5 安装Vim7.4
  10. php 变量类型 typeof,typeof和instanceof的区别是什么
  11. Stanford机器学习---第4讲. 神经网络的表示 Neural Networks representation
  12. JNI_OnLoad
  13. 深信服AC本地用户密码认证配置
  14. IBM Rational Appscan使用之扫描结果分析
  15. GZHU软件方向综合课程设计——课程管理系统(Qt+mysql)
  16. Re:天选2之找不到WLAN网络
  17. 应用服务器和数据库服务器有什么区别?
  18. 三子棋游戏(呆呆详解版)
  19. 堪称神器的Chrome插件
  20. Linux运维基本功(贰)---Linux系统的目录结构

热门文章

  1. 聊聊编程那些破事-0.Prehistory
  2. 什么时候使用z编码_你什么时候编码?
  3. (5)vue.js 基础语法—el选项
  4. 推荐一个Python的开源小工具大合集!
  5. 下载 Bootstrap3 的 Sass 版本
  6. 数值和布尔值的解构赋值
  7. php add action,WordPress学习——add_action()详解
  8. java7 diamond_Java 7 中的新功能
  9. spin协议 matlab 仿真,无线传感器总结复习资料02016学生
  10. 加州大学欧文分校 计算机专业,加州大学欧文分校计算机科学排名第36(2020年TFE美国排名)...