Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
题目链接:https://leetcode.com/problems/merge-intervals/
思路:先排序,然后前后比较是否有overlap的,更新的end,取两者最大的end,看个例子
所以用到了max
用这题的方法做Leetcode 57. Insert Interval不要太简单了,加一行代码就好了
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
static bool cmp(struct Interval a,struct Interval b)
{
if(a.start!=b.start)
return a.start<b.start;
return a.end<b.end;
}
vector<Interval> merge(vector<Interval>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
for(int i=1;i<intervals.size();)
{
if(intervals[i].start<=intervals[i-1].end)
{
intervals[i-1].end=max(intervals[i].end,intervals[i-1].end);
intervals.erase(intervals.begin()+i);
}
else
{
i++;
}
}
return intervals;
}
};
------------------------------------2020.12.1
题目数据结构变了,那个思路超时了
class Solution {
public:
static bool cmp(vector<int> a,vector<int> b)
{
if(a[0]!=b[0])
return a[0]<b[0];
return a[1]<b[1];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
// sort(intervals.begin(),intervals.end(),cmp);
sort(intervals.begin(),intervals.end());
for(int i=1;i<intervals.size();)
{
if(intervals[i][0]<=intervals[i-1][1])
{
intervals[i-1][1]=max(intervals[i][1],intervals[i-1][1]);
intervals.erase(intervals.begin()+i);
}
else
{
i++;
}
}
return intervals;
}
};
找到原因了,因为在原有的vector上erase(),比较费时,应该新开一个vector存放结果值。我觉得以后还是用emplace_back()吧,虽然我知道更快,关于emplace_back()和push_back()的比较但一般没用它。
class Solution {
public:
static bool cmp(vector<int> a,vector<int> b)
{
if(a[0]!=b[0])
return a[0]<b[0];
return a[1]<b[1];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
// sort(intervals.begin(),intervals.end(),cmp);
sort(intervals.begin(),intervals.end());
vector<vector<int>> res;
res.emplace_back(intervals[0]);
for(int i=1;i<intervals.size();i++)//比如res={1,3} 和{2,4}进行合并
{
if(intervals[i][0]<=res.back()[1])
{
res.back()[1]=max(res.back()[1],intervals[i][1]);
}
else
{
res.emplace_back(intervals[i]);
}
}
return res;
}
};