11#include <stdio.h>
22#include <stdlib.h>
3- #include <string.h>
43
5- struct Interval {
6- int start ;
7- int end ;
8- };
94
10- static int binary_search ( int * nums , int size , int target )
5+ static int compare ( const void * a , const void * b )
116{
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 ];
278}
289
2910/**
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 ));
4519 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 ] ;
4822 }
23+ tmp [i * 2 ] = newInterval [0 ];
24+ tmp [i * 2 + 1 ] = newInterval [1 ];
25+ qsort (tmp , intervalsSize + 1 , 2 * sizeof (int ), compare );
4926
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 ];
7039 }
7140 }
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 ;
10647 }
107-
108- free (nums );
109- * returnSize = count ;
110- return p ;
48+
49+ return results ;
11150}
11251
11352int main (int argc , char * * argv )
@@ -117,23 +56,24 @@ int main(int argc, char **argv)
11756 exit (-1 );
11857 }
11958
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 ]);
12362
12463 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 ]) ;
13170 }
13271
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 );
13474 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 ]);
13776 }
77+
13878 return 0 ;
13979}
0 commit comments