LeetCode – Insert Interval
Problem:
Given a set of non-overlapping & sorted intervals, insert a new interval into the intervals (merge if necessary).
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].
Java Solution 1
When iterating over the list, there are three cases for the current range.
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */ public class Solution { public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) { ArrayList<Interval> result = new ArrayList<Interval>(); for(Interval interval: intervals){ if(interval.end < newInterval.start){ result.add(interval); }else if(interval.start > newInterval.end){ result.add(newInterval); newInterval = interval; }else if(interval.end >= newInterval.start || interval.start <= newInterval.end){ newInterval = new Interval(Math.min(interval.start, newInterval.start), Math.max(newInterval.end, interval.end)); } } result.add(newInterval); return result; } } |
Java Solution 2 - Binary Search
If the intervals list is an ArrayList, we can use binary search to make the best search time complexity O(log(n)). However, the worst time is bounded by shifting the array list if a new range needs to be inserted. So time complexity is still O(n).
public List<Interval> insert(List<Interval> intervals, Interval newInterval) { List<Interval> result = new ArrayList<>(); if (intervals.size() == 0) { result.add(newInterval); return result; } int p = helper(intervals, newInterval); result.addAll(intervals.subList(0, p)); for (int i = p; i < intervals.size(); i++) { Interval interval = intervals.get(i); if (interval.end < newInterval.start) { result.add(interval); } else if (interval.start > newInterval.end) { result.add(newInterval); newInterval = interval; } else if (interval.end >= newInterval.start || interval.start <= newInterval.end) { newInterval = new Interval(Math.min(interval.start, newInterval.start), Math.max(newInterval.end, interval.end)); } } result.add(newInterval); return result; } public int helper(List<Interval> intervals, Interval newInterval) { int low = 0; int high = intervals.size() - 1; while (low < high) { int mid = low + (high - low) / 2; if (newInterval.start <= intervals.get(mid).start) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : high - 1; } |
The best time is O(log(n)) and worst case time is O(n).
<pre><code> String foo = "bar"; </code></pre>
-
Amr Hendy
-
Sreekar
-
Matias SM
-
Jack Y
-
Juan Gomez
-
Omar Edgardo Lugo Sánchez
-
tia
-
GuoJiaAgain
-
Kevin