当前位置: 首页 > news >正文

【玩转贪心算法专题】56. 合并区间【中等】

【玩转贪心算法专题】56. 合并区间【中等】

1、力扣链接

https://leetcode.cn/problems/merge-intervals/description/

2、题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 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] 可被视为重叠区间。

提示:

1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104

3、题目分析

对于贪心算法的题目,可从 寻求局部最优解入手,以局部最优解,得到全局最优解
排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=)

4、代码实现

1、Java

class Solution {public int[][] merge(int[][] intervals) {//如果右大于左就合并//List<int[]> res = new LinkedList<>();//按照左边界排序Arrays.sort(intervals,(x,y) -> Integer.compare(x[0],y[0]));//initial start 是最小左边界int start = intervals[0][0];int rightmostRightBound = intervals[0][1];for(int i=1;i< intervals.length;i++){//如果左边界大于最大右边界if(intervals[i][0] > rightmostRightBound){//加入区间 并更新startres.add(new int[]{start,rightmostRightBound});start = intervals[i][0];rightmostRightBound = intervals[i][1];}else{//更新最大右边界rightmostRightBound = Math.max(rightmostRightBound,intervals[i][1]);}}res.add(new int[]{start,rightmostRightBound});return res.toArray(new int[res.size()][]);
}
}

2、C++

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0) return result; // 区间集合为空直接返回// 排序的参数使用了lambda表达式sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并result.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) {if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间// 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的result.back()[1] = max(result.back()[1], intervals[i][1]); } else {result.push_back(intervals[i]); // 区间不重叠 }}return result;}
};

3、python

class Solution:def merge(self, intervals):result = []if len(intervals) == 0:return result  # 区间集合为空直接返回intervals.sort(key=lambda x: x[0])  # 按照区间的左边界进行排序result.append(intervals[0])  # 第一个区间可以直接放入结果集中for i in range(1, len(intervals)):if result[-1][1] >= intervals[i][0]:  # 发现重叠区间# 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的result[-1][1] = max(result[-1][1], intervals[i][1])else:result.append(intervals[i])  # 区间不重叠return result

4、go

func merge(intervals [][]int) [][]int {sort.Slice(intervals, func(i, j int) bool {return intervals[i][0] < intervals[j][0]})res := make([][]int, 0, len(intervals))left, right := intervals[0][0], intervals[0][1]for i := 1; i < len(intervals); i++ {if right < intervals[i][0] {res = append(res, []int{left, right})left, right = intervals[i][0], intervals[i][1]} else {right = max(right, intervals[i][1])}}res = append(res, []int{left, right})  // 将最后一个区间放入return res
}
func max(a, b int) int {if a > b {return a}return b
}

http://www.mrgr.cn/news/37312.html

相关文章:

  • Java通过base64将文件生成到指定位置
  • JAVA学习-练习试用Java实现“翻转字符串里的单词”
  • css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis的使用
  • css div多边框斜角边框
  • 面试小妙招:轻松绕过五大“坑”,展现真实自我
  • ARM汇编语言: lesson 2(ADD, SUB, MUL, set CPSR)
  • 文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于自适应时段划分的含氢微能网中长期变分辨率调度》
  • APP商业化变现模
  • 理解CPU上下文切换-下
  • springboot中有哪些方式可以解决跨域问题
  • Java中使用ZXing和QRCode生成二维码(附Demo)
  • 【SpringBoot详细教程】-06-Restful风格【持续更新】
  • Lod2城市三维模型是什么意思?
  • 你要的录音播放录音功能,直接用!Air201资产定位模组LuatOS快速入门
  • Django Web开发基础介绍
  • SemiDrive E3 MCAL 开发系列(4) – Gpt 模块的使用
  • 软考高级:系统设计 - MDA 模型 AI 解读
  • 生信初学者教程(十二):数据汇总
  • Windows下jenkins执行远程sh脚本中文乱码问题
  • FPGA实现PCIE图片采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持