不多废话,直接上代码;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& in)
{
if(!in.size()) return {};
sort(in.begin(),in.end());
vector<vector<int>> ans;
for(int i=0;i<in.size();i++)
{
int l = in[i][0], r = in[i][1];
if(!ans.size()||ans[ans.size()-1][1]<l) ans.push_back({l,r});
else ans[ans.size()-1][1]=max(ans[ans.size()-1][1],r);
}
return ans;
}
};
这个解答方法是官方提供的,大致原理是:
先将数组按照左边的数字排个序;然后将第一组数放进ans数组里面,然后往后遍历in数组,如果下一组数的左边大于ans最后面这组数的右边,那么就不会有交集,直接把这组数加到ans的后面;反过来,就证明有交集,那么就把ans里面做后那组数的右边等于这两组数中右边较大的那个数。
接下来是评论区的某位大佬解答:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& in)
{
int n=in.size();
vector<vector<int>> ans;
vector<int> l,r;
for(int i=0;i<n;i++)
{
l.push_back(in[i][0]);
r.push_back(in[i][1]);
}
sort(l.begin(),l.end());
sort(r.begin(),r.end());
for(int i=0,j=0;i<n;i++)
{
if(i==n-1||l[i+1]>r[i])
{
ans.push_back({l[j],r[i]});
j=i+1;
}
}
return ans;
}
};
这个解答原理大致是:
先把所有的左边数放到l数组里面,把所有的右边数放到r数组里面,然后排序;接下来定义两个指针,i指针不断的往后面遍历,直到找到相邻的左边大于右边的位置i(因为l[i]<r[i]恒成立,所以要找相邻的),那么r[i]就相当于是上一个阶段中右边最大的那个数,j指向的就是最小的左边那个数。然后更细j指向下一个阶段中最小的左边那个数。
官方解答:https://leetcode-cn.com/problems/merge-intervals/solution/he-bing-qu-jian-by-leetcode-solution/