leetcode Insert Interval
题目:给定一系列的区间,这些区间是不重合的,而且按每个区间的起始点排好序了。再来一个区间。怎么得到所有合并后的区间。
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]
.
考虑周到就可以做了。我是这样想的:
1.如果给定要插入区间的开始比之前某些区间的结束还大,那之前那些区间就肯定是答案一部分。最后要判断是不是已经是结尾了,如果是,插入区间后就可以返回了。
2.再1之后就找了当前区间的结束比要插入区间的start大或者相等,这个时候肯定就存在区间合并了,那么我们先确定合并之后区间tmp的start。这个start应该是min(当前区间的start和要插入的start),在继续找到tmp的end就完成了重复区间的合并。
3.找end,一直往后找,知道找到一个end比要插入的end大,那么这个时候要看要插入的end是不是在找到的这个区间中,如在,那么tmp的end显然就是现在遍历到的end。否则tmp的end就是要出入的end。
4.记得找到end后要把剩下的区间(如果有的话)记录。
/** * 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) { vector<Interval> ans; vector<Interval>::iterator p = intervals.begin(); Interval tmp; while (p != intervals.end() && (*p).end < newInterval.start) ans.push_back(*p++); // 找到newInterval起点大的区间,如果有没有,就直接如下输出答案 if (p == intervals.end()) { ans.push_back(newInterval); return ans; } tmp = *p; // tmp主要用来记录跨越区间的起点和终点 if((*p).start > newInterval.start) tmp.start = newInterval.start; // 确定起点 while(p!=intervals.end() && (*p).end < newInterval.end) p++; if(p == intervals.end()) { tmp.end = newInterval.end; ans.push_back(tmp); return ans; } if((*p).start <= newInterval.end) // 如果end在区间内,那么确定tmp的end后把剩下的区间也记录到答案中输出 { tmp.end = (*p).end; ans.push_back(tmp); while(++p != intervals.end()) ans.push_back(*p); return ans; } tmp.end = newInterval.end;ans.push_back(tmp); // end不在区间内,那end就是tmp的end了,再把剩下的区间记录 while(p!=intervals.end()) ans.push_back(*p++); return ans; } };
这个大神的解法写的比较简洁。他的思路是最后找要插入的区间的end是否大于某个区间的start来判断,而我是用end。
直接贴过来吧
vector<Interval> insert(vector<Interval> &v, Interval nv) { vector<Interval> rs; int i = 0; for ( ; i < v.size() && v[i].end < nv.start; i++) { rs.push_back(v[i]); } if (i == v.size()) { rs.push_back(nv); return rs; } nv.start = min(nv.start, v[i].start); for ( ; i < v.size() && v[i].start <= nv.end; i++) { nv.end = max(nv.end, v[i].end); } rs.push_back(nv); for ( ; i < v.size(); i++) { rs.push_back(v[i]); } return rs; }