#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int comp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
int *start = (int *)malloc(sizeof(int) * intervalsSize);
int *end = (int *)malloc(sizeof(int) * intervalsSize);
int **result = (int **)malloc(sizeof(int *) * intervalsSize);
*returnSize = 0;
*returnColumnSizes = (int *)malloc(sizeof(int) * intervalsSize);
int i, j;
for(i = 0; i<intervalsSize; ++i)
{
start[i] = intervals[i][0];
end[i] = intervals[i][1];
result[i] = (int *)malloc(sizeof(int) * (*intervalsColSize));
}
qsort(start, intervalsSize, sizeof(int), comp);
qsort(end, intervalsSize, sizeof(int), comp);
for(i = 0, j=0; i<intervalsSize && j<intervalsSize;)
{
(*returnColumnSizes)[*returnSize] = *intervalsColSize;
//printf("[%d, ", start[i]);
result[*returnSize][0] = start[i];
again: while(i < intervalsSize && start[i] <= end[j]) i++;
//while(j < intervalsSize && end[j] <= start[i]) j++;
if(i < intervalsSize && end[i-1] >= start[i])
{
j = i-1;
goto again;
}
j = i;
//printf("%d]\n", end[j-1]);
result[*returnSize][1] = end[j-1];
(*returnSize)++;
}
return result;
}
int main()
{
int nums[4][2] = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
int intervalsSize = 4;
int intervalsColSize = 2;
int returnSize = 0;
int *returnColumnSizes = (int *)malloc(sizeof(int) * intervalsSize);
int **intervals = (int **)malloc(sizeof(int *) * intervalsSize);
int i, j;
for(i = 0; i<intervalsSize; ++i)
{
intervals[i] = nums[i];
}
int **result = merge(intervals, intervalsSize, &intervalsColSize, &returnSize, &returnColumnSizes);
printf("[");
for(i = 0; i<returnSize; ++i)
{
printf("[");
for(j = 0; j<returnColumnSizes[i]; j++)
{
printf("%d, ", result[i][j]);
}
printf("], ");
}
printf("]\n");
}