前面两个纯纯复制写法,就最后一个写出来了
56. 合并区间
随想录文字讲解:代码随想录 (programmercarl.com)
随想录视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili
状态:写出来了
先写一个cmp函数把数组排序一下。
然后int从1开始遍历整个数组。
与前一个重叠的判断:该区间的左区间小于等于上个区间的右区间(本体中要求等于也算)。
如果与前一个不重叠:就把上一个区间存入结果中。
如果与上一个重叠:就把该区间变为该区间与前一个区间的合区间(因为每次读取比较的区间都是前一个区间,这样下一个区间就能与合并后的大区间比较)
这样最后一个区间会被遗漏(如果与上一个不重叠就存上一个,如果重叠就改写自己),所以别忘了遍历结束后将最后一个区间也加入结果集中(虽然漏下了存入的操作,但是已经被判断结束了)
代码如下:
class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b)
{
return a[0]<b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
vector<vector<int>> res;
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]<=intervals[i-1][1])
{
intervals[i][0]=intervals[i-1][0];
intervals[i][1]=max(intervals[i][1],intervals[i-1][1]);
}
else
{
res.push_back(intervals[i-1]);
}
}
res.push_back(intervals[intervals.size()-1]);
return res;
}
};
随想录做法:
我是遍历并存入上一个区间,随想录是一边遍历一边存入该区间。
先将第一个区间压入result,然后从i=1开始遍历,如果与结果集末尾(也就是上一个)区间重叠,改变末尾结果集,否则不重叠就把该区间压入。