Skip to content

Commit a9357a2

Browse files
authored
Create: 0056-merge-intervals.c
1 parent 7c19317 commit a9357a2

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

c/0056-merge-intervals.c

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Interval structure
2+
struct Interval {
3+
int start;
4+
int end;
5+
};
6+
7+
// Function to compare intervals for sorting
8+
int compareIntervals(const void* a, const void* b) {
9+
return ((struct Interval*)a)->start - ((struct Interval*)b)->start;
10+
}
11+
12+
// Function to merge intervals
13+
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) {
14+
if (intervalsSize <= 1) {
15+
*returnSize = intervalsSize;
16+
*returnColumnSizes = intervalsColSize;
17+
return intervals;
18+
}
19+
20+
// Create an array of Interval structures
21+
struct Interval* sortedIntervals = (struct Interval*)malloc(sizeof(struct Interval) * intervalsSize);
22+
for (int i = 0; i < intervalsSize; i++) {
23+
sortedIntervals[i].start = intervals[i][0];
24+
sortedIntervals[i].end = intervals[i][1];
25+
}
26+
27+
// Sort intervals based on start times
28+
qsort(sortedIntervals, intervalsSize, sizeof(struct Interval), compareIntervals);
29+
30+
// Merge intervals
31+
struct Interval* mergedIntervals = (struct Interval*)malloc(sizeof(struct Interval) * intervalsSize);
32+
int mergedCount = 0;
33+
34+
for (int i = 0; i < intervalsSize; i++) {
35+
if (mergedCount == 0 || mergedIntervals[mergedCount - 1].end < sortedIntervals[i].start) {
36+
mergedIntervals[mergedCount++] = sortedIntervals[i];
37+
} else {
38+
mergedIntervals[mergedCount - 1].end = mergedIntervals[mergedCount - 1].end > sortedIntervals[i].end
39+
? mergedIntervals[mergedCount - 1].end
40+
: sortedIntervals[i].end;
41+
}
42+
}
43+
44+
// Allocate memory for return arrays
45+
int** result = (int**)malloc(sizeof(int*) * mergedCount);
46+
*returnColumnSizes = (int*)malloc(sizeof(int) * mergedCount);
47+
48+
for (int i = 0; i < mergedCount; i++) {
49+
result[i] = (int*)malloc(sizeof(int) * 2);
50+
result[i][0] = mergedIntervals[i].start;
51+
result[i][1] = mergedIntervals[i].end;
52+
(*returnColumnSizes)[i] = 2;
53+
}
54+
55+
*returnSize = mergedCount;
56+
57+
free(sortedIntervals);
58+
free(mergedIntervals);
59+
60+
return result;
61+
}

0 commit comments

Comments
 (0)