leetcode第一刷_Insert Interval
这道题的难度跟微软的那道面试题相当。
要在集合中插入一段新的集合,相当于求两个集合的并了。对于新增加一段集合的情况,分为以下几种:
1. 增加段跟原来的全然相交,也即他的起点和终点都在被包括在原来的段中了。
这样的情况要合并这之间的段,终于增加段的起点是原来段的起点,终点是原来段的终点。
2. 增加段的起点与原来的相交。终点没有相交。终于增加的段的起点是起点相交的段的起点。终点是增加段的终点。
3. 增加段的终点与原来的相交,起点没有相交。终于增加段的起点是增加段的起点,终点是相交段的终点。
4. 增加段与原来的段没有相交。那么直接增加增加段。
在实现的时候,推断相交我用的是二分查找。对增加段的起点和终点分别查找。假设找到了的话,标记找到。并返回相交段的编号。否则的话标记未找到,返回应该插入的位置。因为函数接口要求的是返回整个更新后的段,因此除了终于增加段。要把两头的那部分没有影响到的段又一次拷贝一下。
有关后半段从哪个位置開始拷贝,分两种情况,假设终点找到了相交段,应该从相交段后面一段開始拷贝,否则的话应该从插入位置的那一段開始。
class Solution {
public:
pair<int, int> findPos(vector<Interval> &intervals, int pos, int start, int end){
if(start>end) return make_pair(0, start);
int mid = (start+end)/2;
if(intervals[mid].start<=pos&&pos<=intervals[mid].end){
return make_pair(1, mid);
}else if(intervals[mid].start>pos){
return findPos(intervals, pos, start, mid-1);
}else if(intervals[mid].end<pos){
return findPos(intervals, pos, mid+1, end);
}
return make_pair(-1, -1);
}
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
pair<int, int> lr, rr;
int msize = intervals.size();
vector<Interval> res;
if(msize == 0){
res.push_back(newInterval);
return res;
}
Interval intv(0, 0);
lr = findPos(intervals, newInterval.start, 0, msize-1);
rr = findPos(intervals, newInterval.end, 0, msize-1);
for(int i=0;i<lr.second;i++)
res.push_back(intervals[i]);
if(lr.first&&rr.first){
intv.start = intervals[lr.second].start;
intv.end = intervals[rr.second].end;
}else if(lr.first&&!rr.first){
intv.start = intervals[lr.second].start;
intv.end = newInterval.end;
}else if(!lr.first&&rr.first){
intv.start = newInterval.start;
intv.end = intervals[rr.second].end;
}else{
intv = newInterval;
}
res.push_back(intv);
int mstart;
if(rr.first) mstart = rr.second+1;
else mstart = rr.second;
for(int i=mstart;i<msize;i++)
res.push_back(intervals[i]);
return res;
}
};
posted on 2019-04-22 14:56 xfgnongmin 阅读(105) 评论(0) 编辑 收藏 举报