思路:
这题不难,先将区间进行“排序”,然后遍历每个区间(下面代码中的cur表示当前区间)看是否与前面的区间(下面代码中的tmp表示前面合并的一个区间)重合。分如下两种情况:
(1) 如果重合,将tmp和cur区间合并为一个区间(更新tmp.end);
(2) 如果不重合,则tmp为一个合并后的区段,保存tmp。
然而,我做这题的时候开始没有将compare函数申明为static,然而运行不通过,通过百度之后发现要将compare函数申明为static,加上之后程序就AC了。
知识点:compare函数必须声明为静态成员函数或者全局函数,不能作为普通成员函数。
原因:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法在sort中调用非静态成员函数。
解决方法:可以把compare改成静态或者全局函数,使之不依赖于具体对象。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
class Solution {
public:
/*compare函数必须声明为静态成员函数或者全局函数,不能作为普通成员函数
解释:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法在sort中调用非静态成员函数。
可以把compare改成静态或者全局函数,使之不依赖于具体对象。*/
//对区间进行排序
static bool compare(Interval A,Interval B)
{
if (A.start != B.start)
return A.start < B.start;
else
return A.end < B.end;
}
vector<Interval> merge(vector<Interval>& intervals) {
int n = intervals.size();
if (0 == n || 1 == n) return intervals;
vector<Interval> res;
//对区间进行排序
sort(intervals.begin(), intervals.end(), compare);
vector<Interval>::iterator cur = intervals.begin();
Interval tmp = *cur;
++cur;
for (;cur != intervals.end();)
{
//新的区段,则将tmp放到res中
if (tmp.end < cur->start)
{
res.push_back(tmp);
tmp = *cur;
}
//tmp.end >= cur->start,有重合,则合并,更新tmp的结尾位置
else
{
tmp.end = max(tmp.end, cur->end);
}
++cur;
}
res.push_back(tmp);
return res;
}
};
int main()
{
Solution s;
/*For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].*/
Interval int1( 1,3), int2(2, 6), int3(8, 10), int4(15,18);
vector<Interval> intervals;
intervals.push_back(int3);
intervals.push_back(int1);
intervals.push_back(int2);
intervals.push_back(int3);
intervals.push_back(int4);
vector<Interval> res = s.merge(intervals);
//输出结果
for (vector<Interval>::iterator it = res.begin();it!=res.end();++it)
{
cout<<"["<<it->start<<","<<it->end<<"]"<<'\t';
}
cout<<endl;
return 0;
}