题目:
解答:
最开始看以为是会有坑比较复杂,所以用了一个很暴利的区分各种情况分析的做法,将新插入newInterval的start,end的位置各种可能分别标记出来,最后根据各种情况分别计算。见方法一。
做完后,看了LeetCode里面别人的代码,才感觉自己的做法比较傻,两种方法都列不出来了。
代码:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
// 方法一:自己的分类查找
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
int len = intervals.size();
vector<Interval> result;
if(len == 0){
result.push_back(newInterval);
return result;
}
if(newInterval.end < intervals[0].start){
result.push_back(newInterval);
result.insert(result.begin()+1, intervals.begin(), intervals.end());
return result;
}
if(newInterval.start > intervals[len-1].end){
result.insert(result.begin(), intervals.begin(), intervals.end());
result.push_back(newInterval);
return result;
}
int beginindex = -1, endindex = -1, i = 0;
int startstatus = 0; // 1. 位于一个interval之间,包括端点 2. 位于两个interval之间,不包括端点
int endstatus = 0; // 1. 位于一个interval之间,包括端点 2. 位于两个interval之间,不包括端点
if(intervals[0].start > newInterval.start){
startstatus = 2;
beginindex = -1;
}
while(i < len){
// check start
if(startstatus == 0){
if(intervals[i].start <= newInterval.start && intervals[i].end >= newInterval.start){
startstatus = 1;
beginindex = i;
}else if(i < len - 1 && intervals[i].end < newInterval.start && intervals[i+1].start > newInterval.start){
startstatus = 2;
beginindex = i;
}
}
// check end
if(endstatus == 0){
if(intervals[i].start <= newInterval.end && intervals[i].end >= newInterval.end){
endstatus = 1;
endindex = i;
break;
}else if(i < len - 1 && intervals[i].end < newInterval.end && intervals[i+1].start > newInterval.end){
endstatus = 2;
endindex = i;
break;
}
}
++i;
}
if(i == len && endstatus == 0){
// 此时newInterval.end 在intervals的更后面
endstatus = 2;
endindex = len - 1;
}
cout << beginindex << " " << endindex << " " << startstatus << " " << endstatus << endl;
// 区分几种类型
if(startstatus == 1 && endstatus == 1){
//情况一:被包含,直接返回原数组
if(beginindex == endindex){
return intervals;
}
//情况二:newInterva并联上几个interval的元素
else{
result.insert(result.begin(), intervals.begin(), intervals.begin() + beginindex);
Interval middle(intervals[beginindex].start, intervals[endindex].end);
result.push_back(middle);
result.insert(result.end(), intervals.begin()+endindex+1, intervals.end());
return result;
}
}
else if(startstatus == 1 && endstatus == 2){
//情况三:起始点被包含,终点在间隔区
result.insert(result.begin(), intervals.begin(), intervals.begin()+beginindex);
Interval middle(intervals[beginindex].start, newInterval.end);
result.push_back(middle);
result.insert(result.end(), intervals.begin()+endindex+1, intervals.end());
return result;
}
else if(startstatus == 2 && endstatus == 1){
//情况四:起始点在间隔区,终点被包含
result.insert(result.begin(), intervals.begin(), intervals.begin()+beginindex+1);
Interval middle(newInterval.start, intervals[endindex].end);
result.push_back(middle);
result.insert(result.end(), intervals.begin()+endindex+1, intervals.end());
return result;
}
else{
//情况五:起始点、终止点都在间隔区
result.insert(result.begin(), intervals.begin(), intervals.begin()+beginindex+1);
result.push_back(newInterval);
result.insert(result.end(), intervals.begin()+endindex+1, intervals.end());
return result;
}
return {};
}
// 方法二:已有的最简洁的方法
vector<Interval> insert(vector<Interval>& intervals, Interval n) {
vector<Interval> sol;
int i = 0;
while (i < intervals.size()&& intervals[i].end < n.start) {
sol.push_back(intervals[i++]);
}
while (i < intervals.size() && n.end >= intervals[i].start) {
n.start = min(n.start, intervals[i].start);
n.end = max(n.end, intervals[i++].end);
}
sol.push_back(n);
while (i < intervals.size()) {
sol.push_back(intervals[i++]);
}
return sol;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)