1+ package com .leetcode .arrays ;
2+
3+ import java .util .Arrays ;
4+
5+ /**
6+ * Level: Hard
7+ * Problem Link: https://leetcode.com/problems/insert-interval/
8+ * Problem Description:
9+ * Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
10+ * <p>
11+ * You may assume that the intervals were initially sorted according to their start times.
12+ * <p>
13+ * Example 1:
14+ * Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
15+ * Output: [[1,5],[6,9]]
16+ * <p>
17+ * Example 2:
18+ * Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
19+ * Output: [[1,2],[3,10],[12,16]]
20+ * Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
21+ * <p>
22+ * Companies: LinkedIn
23+ * Related: {@link MergeIntervals}.
24+ *
25+ * @author rampatra
26+ * @since 2019-07-23
27+ */
28+ public class InsertInterval {
29+
30+ /**
31+ * Time Complexity: O(n)
32+ * Space Complexity: O(n)
33+ * Runtime: <a href="https://leetcode.com/submissions/detail/245767085/">2 ms</a>.
34+ *
35+ * @param intervals
36+ * @param newInterval
37+ * @return
38+ */
39+ public static int [][] insert (int [][] intervals , int [] newInterval ) {
40+ if (intervals .length == 0 && newInterval .length == 0 ) {
41+ return new int [][]{};
42+ } else if (intervals .length == 0 ) {
43+ return new int [][]{newInterval };
44+ }
45+
46+ int [][] mergedIntervals = new int [intervals .length + 1 ][2 ];
47+ int j = 0 ;
48+
49+ for (int i = 0 ; i < intervals .length ; i ++) {
50+ if (newInterval == null || newInterval [0 ] > intervals [i ][1 ]) { // newInterval is after the ith interval
51+ mergedIntervals [j ++] = intervals [i ];
52+ } else if (newInterval [1 ] < intervals [i ][0 ]) { // newInterval is before the ith interval
53+ mergedIntervals [j ++] = newInterval ;
54+ mergedIntervals [j ++] = intervals [i ];
55+ newInterval = null ;
56+ } else { // if overlapping
57+ newInterval [0 ] = Math .min (newInterval [0 ], intervals [i ][0 ]);
58+ newInterval [1 ] = Math .max (newInterval [1 ], intervals [i ][1 ]);
59+ }
60+ }
61+
62+ if (newInterval != null ) {
63+ mergedIntervals [j ++] = newInterval ;
64+ }
65+
66+ return Arrays .copyOfRange (mergedIntervals , 0 , j );
67+ }
68+
69+ public static void main (String [] args ) {
70+ System .out .println (Arrays .deepToString (insert (new int [][]{}, new int []{})));
71+ System .out .println (Arrays .deepToString (insert (new int [][]{}, new int []{5 , 7 })));
72+ System .out .println (Arrays .deepToString (insert (new int [][]{{1 , 5 }}, new int []{0 , 0 })));
73+ System .out .println (Arrays .deepToString (insert (new int [][]{{1 , 5 }}, new int []{2 , 3 })));
74+ System .out .println (Arrays .deepToString (insert (new int [][]{{2 , 5 }, {6 , 7 }, {8 , 9 }}, new int []{0 , 1 })));
75+ System .out .println (Arrays .deepToString (insert (new int [][]{{1 , 3 }, {6 , 9 }}, new int []{2 , 5 })));
76+ System .out .println (Arrays .deepToString (insert (new int [][]{{1 , 2 }, {3 , 5 }, {6 , 7 }, {8 , 10 }, {12 , 16 }}, new int []{4 , 8 })));
77+ }
78+ }
0 commit comments