Skip to content

Commit 7c4ee64

Browse files
feat: add Merge Intervals solution
- Sorting + merge algorithm implementation - Multiple approaches: Sweep Line, Iterative, Recursive - O(n log n) time, O(1) space complexity - Comprehensive solutions and optimizations
1 parent dcbaf8e commit 7c4ee64

File tree

1 file changed

+212
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)