56. 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
- 想要效率高,尽量不要使用erase函数
-
二维数组的sort函数排序是按照每一行第一个元素由小到大进行排序的:
通过这道题清楚的认识到了现在我的逻辑思维缺陷.... 一开始认为是很简单的一道题,只要考虑到各种可能if else 就好 但是如果按照思路一个一个去判断 最后只会越来越乱! 所以看到别人的一个思路,挺多题都用到过,就是先把要合并区间二维数组的第一个元素放入一个新数组中,然后通过和该二维数组的其他单元的一维数组来比较左极限和右极限的大小,一个很简单的判断就能解决问题。 如果不符合判断,那么就把该单元push_back进入新数组中。
- 首先题目并没有说明数组是排序的,所以我们第一步进行排序,根据数组第一位升序排序,一旦第一位相等则按第二位降序排序。
- 第二,由于在原数组进行更改的话需要花费太多时间在删除元素和更改元素上,所以我们声明一个二维数组存放结果,一个一维数组暂时存放要插入的数据。
- 由于是排序过的,所以我们在判断的时候先判断区间下边界是否大于等于下个区间的上边界,若是则可以判断出此时两区间存在重复,反之两区间不重复;继续判断区间的下边界是否小于下个区间的下边界,若是则说明两区间存在交叉,反之说明是区间包含。
源代码如下:
class Solution {
public:
static bool cmp(const vector<int> &a, const vector<int> &b) {
if (a[0] == b[0]) {
return a[1] > b[1];
}
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.empty()) {
return intervals;
}
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> ans{intervals[0]};
int count = 0;
for (int i = 1; i < intervals.size(); i++) {
if (ans[count][1] >= intervals[i][0]) {
//看一下这里 <= 可不可以
if (ans[count][1] <= intervals[i][1]) {
ans[count][1] = intervals[i][1];
//ans.push_back(intervals[i][1]);
}
} else {
ans.push_back(intervals[i]);
count++;
}
}
return ans;
}
};