given a collection of intervals, merge all overlapping intervals.
for example,
given <code>[1,3],[2,6],[8,10],[15,18]</code>,
return
<code>[1,6],[8,10],[15,18]</code>.
对若干个区间进行合并,使合并后的区间没有重叠
先对区间按照左边界排序,然后顺序扫描,合并重叠的区间即可。
代码1在原区间数组上操作,不使用额外的空间,但是需要删除多余的区间,这样会移动数组元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<code>/**</code>
<code> </code><code>* definition for an interval.</code>
<code> </code><code>* struct interval {</code>
<code> </code><code>* int start;</code>
<code> </code><code>* int end;</code>
<code> </code><code>* interval() : start(0), end(0) {}</code>
<code> </code><code>* interval(int s, int e) : start(s), end(e) {}</code>
<code> </code><code>* };</code>
<code> </code><code>*/</code>
<code>class</code>
<code>solution {</code>
<code>private</code><code>:</code>
<code> </code><code>static</code>
<code>bool</code> <code>comp(interval a, interval b)</code>
<code> </code><code>{</code>
<code> </code><code>return</code>
<code>a.start < b.start;</code>
<code> </code><code>}</code>
<code>public</code><code>:</code>
<code> </code><code>vector<interval> merge(vector<interval> &intervals) {</code>
<code> </code><code>if</code><code>(intervals.empty())</code><code>return</code>
<code>intervals;</code>
<code> </code><code>sort(intervals.begin(), intervals.end(), comp);</code>
<code> </code><code>vector<interval>::iterator it1 = intervals.begin(), it2 = it1 + 1;</code>
<code> </code><code>while</code><code>(it1 != intervals.end() && it2 != intervals.end())</code>
<code> </code><code>{</code>
<code> </code><code>if</code><code>(it2->start <= it1->end)</code>
<code> </code><code>{</code>
<code> </code><code>if</code><code>(it1->end < it2->end)it1->end = it2->end;</code>
<code> </code><code>it2++;</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>//[it1+1, it2)范围内的区间可以从原数组删除</code>
<code> </code><code>it1 = intervals.erase(it1+1, it2);</code>
<code> </code><code>it2 = it1 + 1;</code>
<code> </code><code>}</code>
<code> </code><code>if</code><code>(it1 != intervals.end())</code>
<code> </code><code>intervals.erase(it1 + 1, it2);</code>
<code>};</code>
代码2用新数组来存储合并后的区间
<code> </code><code>vector<interval> res;</code>
<code> </code><code>res.push_back(intervals[0]);</code>
<code> </code><code>for</code><code>(</code><code>int</code>
<code>i = 1; i < intervals.size(); i++)</code>
<code> </code><code>interval &p = res.back();</code>
<code> </code><code>if</code><code>(intervals[i].start > p.end)res.push_back(intervals[i]);</code>
<code>if</code><code>(intervals[i].end > p.end)p.end = intervals[i].end;</code>
<code>res;</code>
【版权声明】转载请注明出处: