LeetCode 56. Merge Intervals题解
Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
Example 1:
Input: intervals = [[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: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
Constraints:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
思路:
本题要求就是将多个不同区间的集合进行合并,若有重叠区间则合二为一。
思路就是一个先将整体进行排序,按照每个集合的第一个数进行排序,然后将第一个集合放入ans中,每次将ans中最后一个集合的第二个元素同要比较集合的第一个元素进行比较,因为按照第一个元素进行排序了,如果出现第一个集合的第二个元素和第二个集合的第一个元素比起来,前者大于等于后者,那么说明两个集合是有区间重叠的,则需要进行合并操作,但这里需要注意一个特殊情况,[1,4] [2,3] 这样的两个集合发现第二个集合的第二个元素并没有大于第一个集合的第二个元素,如果是这样的情况则不合并抛弃第二个集合,否则将第一个集合的第二个元素更新为第二个集合的第二个元素即可,切记一定是要大于等于才进行合并,等于的情况例如[1,3][3,5]还是要进合并的。
如果第一个集合的第二个元素小于第二个集合的第一个元素,则说明是两个不同区间,则直接将第二个集合保存到ans中,这里需要注意写cmp函数时候以引用方式传,效率更高。
代码实现:
bool cmp(vector<int> &a,vector<int> &b) {
return a[0]<b[0];//按照数组中第一个数来排序vector
}
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
ans.push_back(intervals[0]);
for(int i=1; i<intervals.size(); i++) {
if(ans.back()[1]>=intervals[i][0]) {//说明有重叠区间则合并
if(intervals[i][1]>ans.back()[1])
ans.back()[1]=intervals[i][1];
} else {
ans.push_back(intervals[i]);
}
}
return ans;
}
};