二维Vector的使用Tips
- 初始化与赋值
vector<vector<int>> res;//默认是[]
vector<vector<int>> intervals={{1,4},{2,3}};
- 添加元素
res.push_back({1,2,3});
bool comp(const vector<int> &a, const vector<int> &b){
return a[0] < b[0];
}
sort(intervals.begin(),intervals.end(),comp);//默认也是这样的,按第一个数去排
这道题最让我悲伤的是我都快毕业了,写排还是想写冒泡,为我的莽撞自罚一杯。
选两个数组记录区间左右,进行排序,锁定左端点,更新i,看其中能找到的右端点范围可以包含几个区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
if(intervals.empty()) return res;
int len=intervals.size();
vector<int> left(len,0);
vector<int> right(len,0);
int lf,rt;
for(int i=0;i<len;i++)
{
left[i]=intervals[i][0];
right[i]=intervals[i][1];
}
for(int i=0;i<len;i++)
{
for(int j=0;j<len-i-1;j++)
{
if(left[j]>left[j+1])
{
swap(left[j],left[j+1]);
swap(right[j],right[j+1]);
}
}
}
for(int i=0;i<len;i++)
{
lf=left[i];
rt=right[i];
while(i<len-1&&(rt>=left[i+1]))
{
i++;
if(right[i]>=rt)
rt=right[i];
}
res.push_back({lf,rt});
}
return res;
}
};
使用了一些技巧之后
思路没变,只是排序与比较均在intervals中完成,将合并后的值导到res中。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
int lf,rt;
if(intervals.empty()) return res;
sort(intervals.begin(),intervals.end());
for(int i=0;i<intervals.size();i++)
{
lf=intervals[i][0];
rt=intervals[i][1];
while(i<intervals.size()-1&&(rt>=intervals[i+1][0]))
{
i++;
if(intervals[i][1]>=rt)
rt=intervals[i][1];
}
res.push_back({lf,rt});
}
return res;
}
};
来源:CSDN
作者:啾九啾
链接:https://blog.csdn.net/qq_40070622/article/details/104077145