Skip to content

Commit c2d2ee9

Browse files
author
applewjg
committed
Insert Interval
1 parent a970ed5 commit c2d2ee9

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

InsertInterval.java

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*
2+
Author: King, [email protected]
3+
Date: Dec 14, 2014
4+
Problem: Insert Interval
5+
Difficulty: Medium
6+
Source: https://oj.leetcode.com/problems/insert-interval/
7+
Notes:
8+
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
9+
You may assume that the intervals were initially sorted according to their start times.
10+
Example 1:
11+
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
12+
Example 2:
13+
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
14+
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
15+
16+
Solution: For example 2:
17+
1. compare [1,2] with [4,9], then insert [1,2];
18+
2. merge [3,5] with [4,9], get newInterval = [3,9];
19+
3. merge [6,7] with [3,9], get newInterval = [3,9];
20+
4. merge [8,10] with [3,9], get newInterval = [3,10];
21+
5. compare [12,16] with [3,10], insert newInterval [3,10], then all the remaining intervals...
22+
Solution 1 : Time O(N).
23+
Solution 2 : Time O(Log(N)).
24+
*/
25+
26+
/**
27+
* Definition for an interval.
28+
* public class Interval {
29+
* int start;
30+
* int end;
31+
* Interval() { start = 0; end = 0; }
32+
* Interval(int s, int e) { start = s; end = e; }
33+
* }
34+
*/
35+
public class Solution {
36+
public List<Interval> insert_1(List<Interval> intervals, Interval newInterval) {
37+
List<Interval> res = new ArrayList<Interval>();
38+
boolean inserted = false;
39+
for (Interval it : intervals) {
40+
if (inserted || it.end < newInterval.start) {
41+
res.add(it);
42+
} else if (it.start > newInterval.end) {
43+
res.add(newInterval);
44+
res.add(it);
45+
inserted = true;
46+
} else {
47+
newInterval.start = Math.min(newInterval.start, it.start);
48+
newInterval.end = Math.max(newInterval.end, it.end);
49+
}
50+
}
51+
if (inserted == false) res.add(newInterval);
52+
return res;
53+
}
54+
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
55+
List<Interval> res = new ArrayList<Interval>();
56+
int n = intervals.size();
57+
int left = 0, right = n - 1;
58+
while (left <= right) {
59+
int mid = left + (right - left) / 2;
60+
if (intervals.get(mid).start > newInterval.start) right = mid - 1;
61+
else left = mid + 1;
62+
}
63+
int idxStart = right;
64+
left = 0; right = n - 1;
65+
while (left <= right) {
66+
int mid = left + (right - left) / 2;
67+
if (intervals.get(mid).end < newInterval.end) left = mid + 1;
68+
else right = mid - 1;
69+
}
70+
int idxEnd = left;
71+
if (idxStart >= 0 && newInterval.start <= intervals.get(idxStart).end) {
72+
newInterval.start = intervals.get(idxStart--).start;
73+
}
74+
if (idxEnd < n && newInterval.end >= intervals.get(idxEnd).start) {
75+
newInterval.end = intervals.get(idxEnd++).end;
76+
}
77+
for (int i = 0; i <= idxStart; ++i) {
78+
res.add(intervals.get(i));
79+
}
80+
res.add(newInterval);
81+
for (int i = idxEnd; i < n; ++i) {
82+
res.add(intervals.get(i));
83+
}
84+
return res;
85+
}
86+
}

0 commit comments

Comments
 (0)