LeetCode Merge Intervals

本文介绍了一种有效的合并区间算法,该算法首先对输入的区间进行排序,然后通过一次遍历即可合并所有重叠的区间。文章详细解释了算法步骤,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

 

合并给定的区间

1、按区间头递增排序;

2、从头开始向后扫描:将临时区间设为第0个区间

     2.1、后一个区间的头小于临时区间的尾,将两者合并;

     2.2、后一个区间的头大于临时区间的尾,将临时区间插入输出结果,将后一个区间作为新的临时区间;

 

代码:

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
bool cm(const Interval &i1,const Interval &i2);	//按头位置递增排序

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {
		vector<Interval> ans;
        sort(intervals.begin(),intervals.end(),cm);	//排序
		int len=intervals.size();
		if(len==0)
			return ans;
		Interval itemp;	//临时数据,用于合并操作
		itemp.start=intervals[0].start;
		itemp.end=intervals[0].end;
		for(int i=1;i<len;i++)	//扫描,合并
		{
			if(intervals[i].start<=itemp.end)	//后面的头小于前面的尾,合并
				itemp.end=max(intervals[i].end,itemp.end);
			else	//不能再合并,压入,取新的区间
			{
				ans.push_back(itemp);
				itemp.start=intervals[i].start;
				itemp.end=intervals[i].end;
			}
		}
		ans.push_back(itemp);	//处理最后一个
		return ans;
    }
};

bool cm(const Interval &i1,const Interval &i2)
{
	return i1.start<i2.start;
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值