# LeetCode题解——Intervals相关题总结

305人阅读 评论(0)

1.Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

/**
* 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> merge(vector<Interval>& intervals) {
int n = intervals.size();
if(n<=1) return intervals;
vector<Interval> res;

sort(intervals.begin(), intervals.end(), comp);
res.push_back(intervals[0]);
for(int i=1; i<n; i++){
auto pre = res.back();
if(pre.end>intervals[i].end) continue;
else if(pre.end<intervals[i].start) {
res.push_back(intervals[i]);
}
else{//merge
intervals[i].start = pre.start;
res.pop_back();
res.push_back(intervals[i]);
}
}
return res;
}

static bool comp(const Interval& a, const Interval& b){
return a.start < b.start;
}
};

2. Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
auto compare = [] (const Interval &intv1, const Interval &intv2)
{ return intv1.end < intv2.start; };
auto range = equal_range(intervals.begin(), intervals.end(), newInterval, compare);
auto itr1 = range.first, itr2 = range.second;
if (itr1 == itr2) {
intervals.insert(itr1, newInterval);
} else {
itr2--;
itr2->start = min(newInterval.start, itr1->start);
itr2->end = max(newInterval.end, itr2->end);
intervals.erase(itr1, itr2);
}
return intervals;
}
};

3.Data Stream as Disjoint Intervals

Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.

For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:

[1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]


struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};

class SummaryRanges {
public:
auto Cmp = [](Interval a, Interval b) { return a.start < b.start; };
auto it = lower_bound(vec.begin(), vec.end(), Interval(val, val), Cmp);
int start = val, end = val;
if(it != vec.begin() && (it-1)->end+1 >= val) it--;
while(it != vec.end() && val+1 >= it->start && val-1 <= it->end)
{
start = min(start, it->start);
end = max(end, it->end);
it = vec.erase(it);
}
vec.insert(it,Interval(start, end));
}

vector<Interval> getIntervals() {
return vec;
}
private:
vector<Interval> vec;
};

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：227115次
• 积分：3969
• 等级：
• 排名：第7856名
• 原创：159篇
• 转载：159篇
• 译文：0篇
• 评论：42条
阅读排行
最新评论