Skip to content

Commit 6ebbfec

Browse files
feat: add Insert Interval solution
- Three pass algorithm implementation - Multiple approaches: Binary Search, Single Pass, Iterative - O(n) time, O(1) space complexity - Comprehensive solutions and optimizations
1 parent 5fb821d commit 6ebbfec

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
/**
2+
* Time Complexity: O(n) - Three passes
3+
* Space Complexity: O(1) - In-place modification
4+
*/
5+
class Solution {
6+
public int[][] insert(int[][] intervals, int[] newInterval) {
7+
List<int[]> result = new ArrayList<>();
8+
9+
// First pass: Add all intervals before newInterval
10+
int i = 0;
11+
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
12+
result.add(intervals[i]);
13+
i++;
14+
}
15+
16+
// Second pass: Merge overlapping intervals with newInterval
17+
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
18+
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
19+
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
20+
i++;
21+
}
22+
result.add(newInterval);
23+
24+
// Third pass: Add all intervals after newInterval
25+
while (i < intervals.length) {
26+
result.add(intervals[i]);
27+
i++;
28+
}
29+
30+
return result.toArray(new int[result.size()][]);
31+
}
32+
}
33+
34+
// Alternative approach using binary search
35+
class SolutionBinarySearch {
36+
public int[][] insert(int[][] intervals, int[] newInterval) {
37+
List<int[]> result = new ArrayList<>();
38+
39+
// Find insertion point using binary search
40+
int left = 0, right = intervals.length;
41+
while (left < right) {
42+
int mid = left + (right - left) / 2;
43+
if (intervals[mid][0] < newInterval[0]) {
44+
left = mid + 1;
45+
} else {
46+
right = mid;
47+
}
48+
}
49+
50+
// Add intervals before insertion point
51+
for (int i = 0; i < left; i++) {
52+
result.add(intervals[i]);
53+
}
54+
55+
// Merge overlapping intervals
56+
int start = newInterval[0];
57+
int end = newInterval[1];
58+
59+
while (left < intervals.length && intervals[left][0] <= end) {
60+
start = Math.min(start, intervals[left][0]);
61+
end = Math.max(end, intervals[left][1]);
62+
left++;
63+
}
64+
65+
result.add(new int[]{start, end});
66+
67+
// Add remaining intervals
68+
for (int i = left; i < intervals.length; i++) {
69+
result.add(intervals[i]);
70+
}
71+
72+
return result.toArray(new int[result.size()][]);
73+
}
74+
}
75+
76+
// Alternative approach using single pass
77+
class SolutionSinglePass {
78+
public int[][] insert(int[][] intervals, int[] newInterval) {
79+
List<int[]> result = new ArrayList<>();
80+
boolean inserted = false;
81+
82+
for (int[] interval : intervals) {
83+
if (!inserted && interval[0] > newInterval[1]) {
84+
result.add(newInterval);
85+
inserted = true;
86+
}
87+
88+
if (inserted || interval[1] < newInterval[0]) {
89+
result.add(interval);
90+
} else {
91+
newInterval[0] = Math.min(newInterval[0], interval[0]);
92+
newInterval[1] = Math.max(newInterval[1], interval[1]);
93+
}
94+
}
95+
96+
if (!inserted) {
97+
result.add(newInterval);
98+
}
99+
100+
return result.toArray(new int[result.size()][]);
101+
}
102+
}
103+
104+
// Alternative approach using iterative
105+
class SolutionIterative {
106+
public int[][] insert(int[][] intervals, int[] newInterval) {
107+
List<int[]> result = new ArrayList<>();
108+
109+
int i = 0;
110+
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
111+
result.add(intervals[i]);
112+
i++;
113+
}
114+
115+
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
116+
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
117+
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
118+
i++;
119+
}
120+
result.add(newInterval);
121+
122+
while (i < intervals.length) {
123+
result.add(intervals[i]);
124+
i++;
125+
}
126+
127+
return result.toArray(new int[result.size()][]);
128+
}
129+
}
130+
131+
// Alternative approach using while loop
132+
class SolutionWhileLoop {
133+
public int[][] insert(int[][] intervals, int[] newInterval) {
134+
List<int[]> result = new ArrayList<>();
135+
136+
int i = 0;
137+
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
138+
result.add(intervals[i]);
139+
i++;
140+
}
141+
142+
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
143+
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
144+
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
145+
i++;
146+
}
147+
result.add(newInterval);
148+
149+
while (i < intervals.length) {
150+
result.add(intervals[i]);
151+
i++;
152+
}
153+
154+
return result.toArray(new int[result.size()][]);
155+
}
156+
}
157+
158+
// Alternative approach using enhanced for loop
159+
class SolutionEnhancedForLoop {
160+
public int[][] insert(int[][] intervals, int[] newInterval) {
161+
List<int[]> result = new ArrayList<>();
162+
boolean inserted = false;
163+
164+
for (int[] interval : intervals) {
165+
if (!inserted && interval[0] > newInterval[1]) {
166+
result.add(newInterval);
167+
inserted = true;
168+
}
169+
170+
if (inserted || interval[1] < newInterval[0]) {
171+
result.add(interval);
172+
} else {
173+
newInterval[0] = Math.min(newInterval[0], interval[0]);
174+
newInterval[1] = Math.max(newInterval[1], interval[1]);
175+
}
176+
}
177+
178+
if (!inserted) {
179+
result.add(newInterval);
180+
}
181+
182+
return result.toArray(new int[result.size()][]);
183+
}
184+
}
185+
186+
// More concise version
187+
class SolutionConcise {
188+
public int[][] insert(int[][] intervals, int[] newInterval) {
189+
List<int[]> result = new ArrayList<>();
190+
int i = 0;
191+
192+
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
193+
result.add(intervals[i++]);
194+
}
195+
196+
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
197+
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
198+
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
199+
i++;
200+
}
201+
result.add(newInterval);
202+
203+
while (i < intervals.length) {
204+
result.add(intervals[i++]);
205+
}
206+
207+
return result.toArray(new int[result.size()][]);
208+
}
209+
}

0 commit comments

Comments
 (0)