题目描述
知识点
排序,数组
结果
实现
码前思考
就是贪心算法区间合并。。。(虽然没说要最大化,但是这样做就是最大化的。。。)- 并不是区间贪心的思想!这个是思维题了。
代码实现
标准解题代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
vector<vector<int>> ans;
for(int i=0;i<intervals.size();){
//初始化
int t = intervals[i][1];
int j = i+1;
while(j<intervals.size() && intervals[j][0] <= t){
t = max(t,intervals[j][1]);
j++;
}
ans.push_back({intervals[i][0],t});
i=j;
}
return ans;
}
};
菜鸡解题代码
class Solution {
public:
static bool cmp(vector<int> a,vector<int> b){
return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int size = intervals.size();
if(size == 0){
return vector<vector<int>>();
}
vector<vector<int> > res;
//进行排序
sort(intervals.begin(),intervals.end(),cmp);
int start = INT_MIN;
int end = INT_MIN;
for(int i=0;i<size;i++){
int curStart = intervals[i][0];
int curEnd = intervals[i][1];
//判断是否有重叠
if(curStart <= end){
end = max(curEnd,end);
}else{
//没有重叠
if(i!=0){//不是第一个
vector<int> tmp;
tmp.push_back(start);
tmp.push_back(end);
res.push_back(tmp);
}
start = curStart;
end = curEnd;
}
}
vector<int> tmp;
tmp.push_back(start);
tmp.push_back(end);
res.push_back(tmp);
return res;
}
};
码后反思
- 可以很明显看出 我的代码非常冗余 ,而网友的标准解题代码写得非常好~~
- 对于这种初始化的题目,应该写两层循环才对,一旦在外层循环找到起点,就到内层循环里面不断地找重点~~
- 对于
vector
对象的排序,居然可以直接sort
,神奇蛤; - 对于插入一个
vector
对象,居然可以直接使用{element1,element2,..}
就可,好棒,代码又减减啦啦啦~~~
二刷代码
这次二刷的时候,已经掌握了一些套路了,同时我也写出了网友的那种代码,不过写的时候我把这段代码:
if(i<intervals.size() && intervals[i][0]<=end){
end=max(intervals[i][1],end);
}else{
break;
}
写成了
if(i<intervals.size() && intervals[i][0]<=end){
end=intervals[i][1];
}else{
break;
}
还好自己测试的时候发现了。。。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;//结果集
//首先排序
sort(intervals.begin(),intervals.end());//好像会默认排序
for(int i=0;i<intervals.size();){
int start = intervals[i][0];
int end = intervals[i][1];
while(true){
i++;
if(i<intervals.size() && intervals[i][0]<=end){
end=max(intervals[i][1],end);
}else{
break;
}
}
res.push_back({start,end});
}
return res;
}
};