题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
题解:用flag数组存储除末端外是否包含的集合,用spFlag数组存储starti = endi的特殊情况,用intInSet判断是否已在队列中。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
vector<int> s;
int flag[10001]={0};
int Max = 0;
int spFlag[10001] = {0};
for(int i = 0;i < intervals.size();i++)
{
Max = max(Max,intervals[i][1]);
if(intervals[i][0] == intervals[i][1])
{
spFlag[intervals[i][0]] = 1;
// flag[intervals[i][1]] = 1;
}
for(int j = intervals[i][0];j<intervals[i][1];j++)
{
flag[j] = 1;
}
}
int isInSet = 0;
for(int i = 0;i<=Max;i++)
{
if(spFlag[i]&&isInSet == 0&&flag[i] == 0)
{
s.push_back(i);
s.push_back(i);
res.push_back(s);
s.clear();
continue;
}
if(flag[i] == 0&&isInSet == 1)
{
// if(spFlag[i])
// {
// continue;
// }
s.push_back(i);
res.push_back(s);
isInSet = 0;
s.clear();
continue;
}
if(flag[i]&&isInSet == 0)
{
isInSet = 1;
s.push_back(i);
}
}
return res;
}
};