@@ -32,104 +32,30 @@ public String toString() {
32
32
Interval (int s , int e ) { start = s ; end = e ; }
33
33
}
34
34
35
- class BinarySearchResult {
36
- int low ;
37
- int high ;
38
- }
39
-
40
- public List <Interval > insertBinarySearchBased (List <Interval > intervals , Interval newInterval ) {
41
- if (intervals .size () == 0 ) {
42
- return Collections .singletonList (newInterval );
43
- }
44
-
45
- if (newInterval .start > intervals .get (intervals .size () - 1 ).end ) {
46
- intervals .add (newInterval );
47
- return intervals ;
48
- }
49
-
50
- if (newInterval .end < intervals .get (0 ).start ) {
51
- intervals .add (0 , newInterval );
52
- return intervals ;
53
- }
54
-
55
- BinarySearchResult bsr1 = search (intervals , newInterval .start );
56
- BinarySearchResult bsr2 = search (intervals , newInterval .end );
57
-
58
- System .out .println (bsr1 .low + " " + bsr1 .high );
59
- System .out .println (bsr2 .low + " " + bsr2 .high );
60
-
35
+ public List <Interval > insert (List <Interval > intervals , Interval newInterval ) {
61
36
List <Interval > result = new ArrayList <>();
62
- int low1 = bsr1 .low == bsr1 .high ? bsr1 .low - 1 : bsr1 .low ;
63
- for (int i = 0 ; i <= low1 ; i ++) {
64
- result .add (intervals .get (i ));
65
- }
66
-
67
- if (bsr1 .low == bsr1 .high && bsr2 .low == bsr2 .high ) {
68
- result .add (new Interval (intervals .get (bsr1 .low ).start , intervals .get (bsr2 .high ).end ));
69
- } else if (bsr1 .low != bsr1 .high && bsr2 .low == bsr2 .high ) {
70
- result .add (new Interval (newInterval .start , intervals .get (bsr2 .high ).end ));
71
- } else if (bsr1 .low == bsr1 .high && bsr2 .low != bsr2 .high ) {
72
- result .add (new Interval (intervals .get (bsr1 .low ).start , newInterval .end ));
73
- } else {
74
- result .add (newInterval );
75
- }
76
- int high = bsr2 .low == bsr2 .high ? bsr2 .high + 1 : bsr2 .high ;
77
- for (int i = high ; i < intervals .size (); i ++) {
78
- result .add (intervals .get (i ));
79
- }
80
- return result ;
81
- }
82
-
83
- private BinarySearchResult search (List <Interval > intervals , int val ) {
84
- int start = 0 ;
85
- int end = intervals .size () - 1 ;
86
- BinarySearchResult bsr = new BinarySearchResult ();
87
- while (start <= end ) {
88
- int middle = (start + end )/2 ;
89
-
90
- Interval middleInterval = intervals .get (middle );
91
-
92
- if (middleInterval .end >= val && middleInterval .start <= val ) {
93
- bsr .low = middle ;
94
- bsr .high = middle ;
95
- return bsr ;
96
- }
97
-
98
- if (middleInterval .start > val && (middle == 0 || intervals .get (middle - 1 ).end < val )) {
99
- bsr .low = middle - 1 ;
100
- bsr .high = middle ;
101
- return bsr ;
102
- }
103
-
104
- if (middleInterval .end < val && (middle == intervals .size () - 1 || intervals .get (middle + 1 ).start > val )) {
105
- bsr .low = middle ;
106
- bsr .high = middle + 1 ;
107
- return bsr ;
108
- }
109
-
110
- if (middleInterval .start > val ) {
111
- end = middle - 1 ;
37
+ boolean alreadyAdded = false ;
38
+ for (int i = 0 ; i < intervals .size (); i ++) {
39
+ if ((intervals .get (i ).end < newInterval .start )) {
40
+ result .add (intervals .get (i ));
41
+ } else if (intervals .get (i ).start > newInterval .end ) {
42
+ if (!alreadyAdded ) {
43
+ result .add (newInterval );
44
+ alreadyAdded = true ;
45
+ }
46
+ result .add (intervals .get (i ));
112
47
} else {
113
- start = middle + 1 ;
48
+ newInterval .start = Math .min (newInterval .start , intervals .get (i ).start );
49
+ newInterval .end = Math .max (newInterval .end , intervals .get (i ).end );
50
+ if (!alreadyAdded ) {
51
+ result .add (newInterval );
52
+ alreadyAdded = true ;
53
+ }
114
54
}
115
55
}
116
- throw new IllegalArgumentException ("This should not happen" );
117
- }
118
-
119
-
120
- public List <Interval > insert (List <Interval > intervals , Interval newInterval ) {
121
- List <Interval > result = new LinkedList <>();
122
- int i = 0 ;
123
- while (i < intervals .size () && intervals .get (i ).end < newInterval .start )
124
- result .add (intervals .get (i ++));
125
- while (i < intervals .size () && intervals .get (i ).start <= newInterval .end ) {
126
- newInterval = new Interval ( // we could mutate newInterval here also
127
- Math .min (newInterval .start , intervals .get (i ).start ),
128
- Math .max (newInterval .end , intervals .get (i ).end ));
129
- i ++;
56
+ if (!alreadyAdded ) {
57
+ result .add (newInterval );
130
58
}
131
- result .add (newInterval );
132
- while (i < intervals .size ()) result .add (intervals .get (i ++));
133
59
return result ;
134
60
}
135
61
0 commit comments