1
- let insert = function ( intervals , newInterval ) {
2
- let res = [ ] ;
3
- let isAdded = false ;
4
-
5
- intervals . forEach ( ( int ) => {
6
- if ( int [ 0 ] > newInterval [ 1 ] ) {
7
- if ( ! isAdded ) {
8
- res . push ( newInterval ) ;
9
- isAdded = true ;
10
- }
11
-
12
- res . push ( int ) ;
13
- } else if ( int [ 1 ] < newInterval [ 0 ] ) {
14
- res . push ( int ) ;
15
- } else {
16
- newInterval [ 0 ] = Math . min ( newInterval [ 0 ] , int [ 0 ] ) ;
17
- newInterval [ 1 ] = Math . max ( newInterval [ 1 ] , int [ 1 ] ) ;
18
- }
19
- } ) ;
20
-
21
- if ( ! isAdded ) {
22
- res . push ( newInterval ) ;
23
- }
1
+ /**
2
+ * https://leetcode.com/problems/insert-interval/
3
+ * Time O(N) | Space O(N)
4
+ * @param {number[][] } intervals
5
+ * @param {number[] } newInterval
6
+ * @return {number[][] }
7
+ */
8
+ var insert = function ( intervals , newInterval ) {
9
+ const { beforeIndex, before } = getBefore ( intervals , newInterval ) ;
10
+ const afterIndex = mergeIntervals ( intervals , newInterval , beforeIndex ) ;
11
+ const after = intervals . slice ( afterIndex ) ;
24
12
25
- return res ;
13
+ return [ ... before , newInterval , ... after ] ;
26
14
} ;
15
+
16
+ const getBefore = ( intervals , newInterval , index = 0 , before = [ ] ) => {
17
+ const hasGap = ( [ prevStart , prevEnd ] , [ currStart , currEnd ] ) =>
18
+ prevEnd < currStart ;
19
+
20
+ while ( index < intervals . length && hasGap ( intervals [ index ] , newInterval ) ) {
21
+ const current = intervals [ index ] ;
22
+
23
+ before . push ( current ) ;
24
+ index ++ ;
25
+ }
26
+
27
+ return { beforeIndex : index , before } ;
28
+ }
29
+
30
+ const mergeIntervals = ( intervals , newInterval , index ) => {
31
+ const hasOverlap = ( [ prevStart , prevEnd ] , [ currStart , currEnd ] ) =>
32
+ currStart <= prevEnd ;
33
+
34
+ while ( index < intervals . length && hasOverlap ( newInterval , intervals [ index ] ) ) {
35
+ const current = intervals [ index ] ;
36
+
37
+ newInterval [ 0 ] = Math . min ( newInterval [ 0 ] , current [ 0 ] ) ;
38
+ newInterval [ 1 ] = Math . max ( newInterval [ 1 ] , current [ 1 ] ) ;
39
+ index ++ ;
40
+ }
41
+
42
+ return index ;
43
+ }
0 commit comments