题目:
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。
提示:
intervals[i][0] <= intervals[i][1]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/c5tv3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路:
- 对 vector<vector<int>> 排序,需要按照先比较区间开始,如果相同再比较区间结束,默认升序
- 使用双指针,左边指针指向当前区间的开始
- 使用一个变量来记录连续的范围 t
- 右指针开始往后寻找,如果后续的区间的开始值比 t 还小,说明存在重复,可以归并到一起
- 此时更新更大的结束值到 t
- 直到区间断开,将 t 作为区间结束,存储到res里边
- 然后移动左指针,跳过中间已经合并的区间
拓展:
c++ sort函数:
1、头文件#include < algorithm>和using namespace std;
2、它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n)3、Sort函数有三个参数:(第三个参数可不写)
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,排序方法)
- sort函数没有第三个参数,实现的是从小到大
#include <iostream>
#include <algorithm>
int main()
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
-
sort()函数里的第三个参数里,需要加入一个比较函数 complare(),可实现从大到小排序·
-
#include<iostream> #include<algorithm> using namespace std; ///实现从大到小的排序的方法 bool complare(int a,int b) { return a>b; } int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则 for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
-
c++标准库强大的功能可以解决手动写比较函数的麻烦
Sortt函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则
less<数据类型>()//从小到大排序
greater<数据类型>()//从大到小排序
-
#include<iostream> #include<algorithm> using namespace std; int main() { int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,less<int>()); //sort(a,a+10,greater<int>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
sort函数还可以实现对字符的排序
-
#include<iostream> #include<algorithm> using namespace std; int main() { char a[11]="asdfghjklk"; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<char>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
https://xulinjie.blog.csdn.net/article/details/76222112
https://blog.csdn.net/liuzuyi200/article/details/8974326
源码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
//首先进行排序
sort(intervals.begin(),intervals.end());
//用于存放最终结果的
vector<vector<int>> res;
//遍历所有vector
for(int i = 0; i < intervals.size();){
//维护一个变量temp 用于记录连续范围的最大值
int t = intervals[i][1];
//依次序遍历排序后vector的其他区间
int j = i+1;
//判断后续区间的左侧值与当前连续范围最大值的关系
while(j < intervals.size() && intervals[j][0] <= t){
//小于关系,则可以合并区间
t = max(t,intervals[j][1]);
j++;
}
//否则,创建新区间
res.push_back({intervals[i][0],t});
i = j;
}
return res;
}
};