题目描述:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
方法一:
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> ans;
int left,right;
left = newInterval[0];
right = newInterval[1];
bool flag = true;
for(int i=0 ; i<intervals.size() ; i++)
{
if(intervals[i][1] < left)
//如果该区间在要插入的新区间左边,且无交集,直接放入ans
{
ans.push_back({intervals[i][0] , intervals[i][1]});
}
else if(right < intervals[i][0])
//如果该区间在要插入的新区间右边,且无交集,直接放入ans
{
if(flag)
{
ans.push_back({left , right});
//此时说明后续的区间都与要插入的新区间无交集了,可以将新区间放入ans了
flag = false;
}
ans.push_back({intervals[i][0] , intervals[i][1]});
}
else
//否则,说明该区间与要插入的新区间有交集,合并两个区间,更新新区间的边界大小
{
left = min(left , intervals[i][0]);
right = max(right , intervals[i][1]);
}
}
if(flag)
{
ans.push_back({left , right});
//判断要插入的新区间是否是放在ans的末尾
}
return ans;
}
};
这道题第一眼看上去就是与前一道的《合并区间》类似,可惜我想了半天,最终因为情况太复杂给自己想懵了,还是决定看题解去。
看了题解之后果然又是恍然大悟,大体上只有两种情况:遍历到的区间与要插入的新区间有交集和无交集,若无交集,则直接将区间放入ans中;若有交集,则合并两者,将该区间并入要插入的新区间中,更新新区间的左边界left和右边界right。