Skip to content

Instantly share code, notes, and snippets.

@kanrourou
Created July 29, 2018 23:30
/**
* 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(), lo = 0, hi = len - 1;
if(intervals.empty() || intervals.back().end < newInterval.start){intervals.push_back(newInterval); return intervals;};
int head = find(intervals, newInterval.start, 0, len - 1, true), tail = find(intervals, newInterval.end, 0, len, false) - 1;
vector<Interval> res;
for(int i = 0; i < head; ++i)res.push_back(intervals[i]);
Interval mergedInterval(min(intervals[head].start, newInterval.start), max(intervals[tail].end, newInterval.end));
res.push_back(mergedInterval);
for(int i = tail + 1; i < len; ++i)res.push_back(intervals[i]);
return res;
}
private:
int find(vector<Interval>& intervals, int target, int lo, int hi, bool isHead)
{
while(lo < hi)
{
int mid = lo + (hi - lo) / 2;
int curr = isHead? intervals[mid].end: intervals[mid].start;
if(isHead)
{
if(curr >= target)hi = mid;
else lo = mid + 1;
}
else
{
if(curr <= target)lo = mid + 1;
else hi = mid;
}
}
return lo;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment