1
1
#include <stdio.h>
2
2
#include <stdlib.h>
3
- #include <string.h>
4
3
5
- struct Interval {
6
- int start ;
7
- int end ;
8
- };
9
4
10
- static int binary_search ( int * nums , int size , int target )
5
+ static int compare ( const void * a , const void * b )
11
6
{
12
- int low = -1 ;
13
- int high = size ;
14
- while (low + 1 < high ) {
15
- int mid = low + (high - low ) / 2 ;
16
- if (target > nums [mid ]) {
17
- low = mid ;
18
- } else {
19
- high = mid ;
20
- }
21
- }
22
- if (high == size || nums [high ] != target ) {
23
- return - high - 1 ;
24
- } else {
25
- return high ;
26
- }
7
+ return ((int * ) a )[0 ] - ((int * ) b )[0 ];
27
8
}
28
9
29
10
/**
30
- ** Return an array of size *returnSize.
31
- ** Note: The returned array must be malloced, assume caller calls free().
32
- **/
33
- static struct Interval * insert (struct Interval * intervals , int intervalsSize , struct Interval newInterval , int * returnSize ) {
34
- struct Interval * p ;
35
- if (intervalsSize == 0 ) {
36
- p = malloc (sizeof (* p ));
37
- p -> start = newInterval .start ;
38
- p -> end = newInterval .end ;
39
- * returnSize = 1 ;
40
- return p ;
41
- }
42
-
43
- int i , count ;
44
- int * nums = malloc (2 * intervalsSize * sizeof (int ));
11
+ * Return an array of arrays of size *returnSize.
12
+ * The sizes of the arrays are returned as *returnColumnSizes array.
13
+ * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
14
+ */
15
+ int * * insert (int * * intervals , int intervalsSize , int * intervalsColSize , int * newInterval , int newIntervalSize , int * returnSize , int * * returnColumnSizes )
16
+ {
17
+ int i , len = 0 ;
18
+ int * tmp = malloc ((intervalsSize + 1 ) * 2 * sizeof (int ));
45
19
for (i = 0 ; i < intervalsSize ; i ++ ) {
46
- nums [i * 2 ] = intervals [i ]. start ;
47
- nums [i * 2 + 1 ] = intervals [i ]. end ;
20
+ tmp [i * 2 ] = intervals [i ][ 0 ] ;
21
+ tmp [i * 2 + 1 ] = intervals [i ][ 1 ] ;
48
22
}
23
+ tmp [i * 2 ] = newInterval [0 ];
24
+ tmp [i * 2 + 1 ] = newInterval [1 ];
25
+ qsort (tmp , intervalsSize + 1 , 2 * sizeof (int ), compare );
49
26
50
- int start0 = binary_search (nums , 2 * intervalsSize , newInterval .start );
51
- int end0 = binary_search (nums , 2 * intervalsSize , newInterval .end );
52
-
53
- int start1 = -1 , end1 = -1 ;
54
- int merge_start = -1 , merge_end = -1 ;
55
- if (start0 >= 0 ) {
56
- merge_start = start0 / 2 ;
57
- } else {
58
- start1 = - start0 - 1 ;
59
- merge_start = start1 / 2 ;
60
- }
61
-
62
- if (end0 >= 0 ) {
63
- merge_end = end0 / 2 ;
64
- } else {
65
- end1 = - end0 - 1 ;
66
- if (end1 % 2 == 0 ) {
67
- merge_end = end1 / 2 > 0 ? end1 / 2 - 1 : 0 ;
68
- } else {
69
- merge_end = end1 / 2 ;
27
+ int * * results = malloc ((intervalsSize + 1 ) * sizeof (int * ));
28
+ results [0 ] = malloc (2 * sizeof (int ));
29
+ results [0 ][0 ] = tmp [0 ];
30
+ results [0 ][1 ] = tmp [1 ];
31
+ for (i = 1 ; i < intervalsSize + 1 ; i ++ ) {
32
+ results [i ] = malloc (2 * sizeof (int ));
33
+ if (tmp [i * 2 ] > results [len ][1 ]) {
34
+ len ++ ;
35
+ results [len ][0 ] = tmp [i * 2 ];
36
+ results [len ][1 ] = tmp [i * 2 + 1 ];
37
+ } else if (tmp [i * 2 + 1 ] > results [len ][1 ]) {
38
+ results [len ][1 ] = tmp [i * 2 + 1 ];
70
39
}
71
40
}
72
-
73
- if (merge_start == merge_end ) {
74
- if (start0 < 0 && end0 < 0 && start1 == end1 && start1 % 2 == 0 ) {
75
- count = intervalsSize + 1 ;
76
- p = malloc (count * sizeof (* p ));
77
- memcpy (p , intervals , merge_start * sizeof (* p ));
78
- p [merge_start ] = newInterval ;
79
- memcpy (p + merge_start + 1 , intervals + merge_start , (intervalsSize - merge_start ) * sizeof (* p ));
80
- } else {
81
- count = intervalsSize ;
82
- p = malloc (count * sizeof (* p ));
83
- memcpy (p , intervals , count * sizeof (* p ));
84
- if (start0 < 0 && start1 % 2 == 0 ) {
85
- p [merge_start ].start = newInterval .start ;
86
- }
87
- if (end0 < 0 && end1 % 2 == 0 ) {
88
- p [merge_end ].end = newInterval .end ;
89
- }
90
- }
91
- } else {
92
- count = intervalsSize - (merge_end - merge_start );
93
- p = malloc (count * sizeof (* p ));
94
- memcpy (p , intervals , merge_start * sizeof (* p ));
95
- memcpy (p + merge_start , intervals + merge_end , (intervalsSize - merge_end ) * sizeof (* p ));
96
- if (start0 < 0 && start1 % 2 == 0 ) {
97
- p [merge_start ].start = newInterval .start ;
98
- } else {
99
- p [merge_start ].start = intervals [merge_start ].start ;
100
- }
101
- if (end0 < 0 && end1 % 2 == 0 ) {
102
- p [merge_start ].end = newInterval .end ;
103
- } else {
104
- p [merge_start ].end = intervals [merge_end ].end ;
105
- }
41
+
42
+ len += 1 ;
43
+ * returnSize = len ;
44
+ * returnColumnSizes = malloc (len * sizeof (int ));
45
+ for (i = 0 ; i < len ; i ++ ) {
46
+ (* returnColumnSizes )[i ] = 2 ;
106
47
}
107
-
108
- free (nums );
109
- * returnSize = count ;
110
- return p ;
48
+
49
+ return results ;
111
50
}
112
51
113
52
int main (int argc , char * * argv )
@@ -117,23 +56,24 @@ int main(int argc, char **argv)
117
56
exit (-1 );
118
57
}
119
58
120
- struct Interval new_interv ;
121
- new_interv . start = atoi (argv [1 ]);
122
- new_interv . end = atoi (argv [2 ]);
59
+ int new_interv [ 2 ] ;
60
+ new_interv [ 0 ] = atoi (argv [1 ]);
61
+ new_interv [ 1 ] = atoi (argv [2 ]);
123
62
124
63
int i , count = 0 ;
125
- struct Interval * intervals = malloc ((argc - 3 ) / 2 * sizeof (struct Interval ));
126
- struct Interval * p = intervals ;
127
- for (i = 3 ; i < argc ; i += 2 ) {
128
- p -> start = atoi ( argv [ i ] );
129
- p -> end = atoi (argv [i + 1 ]);
130
- p ++ ;
64
+ int * size = malloc ((argc - 3 ) / 2 * sizeof (int ));
65
+ int * * intervals = malloc (( argc - 3 ) / 2 * sizeof ( int * )) ;
66
+ for (i = 0 ; i < ( argc - 3 ) / 2 ; i ++ ) {
67
+ intervals [ i ] = malloc ( 2 * sizeof ( int ) );
68
+ intervals [ i ][ 0 ] = atoi (argv [i * 2 + 3 ]);
69
+ intervals [ i ][ 1 ] = atoi ( argv [ i * 2 + 4 ]) ;
131
70
}
132
71
133
- struct Interval * q = insert (intervals , (argc - 3 ) / 2 , new_interv , & count );
72
+ int * col_sizes ;
73
+ int * * results = insert (intervals , (argc - 3 ) / 2 , size , new_interv , 2 , & count , & col_sizes );
134
74
for (i = 0 ; i < count ; i ++ ) {
135
- printf ("[%d, %d]\n" , q -> start , q -> end );
136
- q ++ ;
75
+ printf ("[%d,%d]\n" , results [i ][0 ], results [i ][1 ]);
137
76
}
77
+
138
78
return 0 ;
139
79
}
0 commit comments