##第一道hard
思路:
将新插入的区间一个个去比较,有交集的,取并集并放到哈希表里,拿新并集继续和下一个比较,最后做一个排序。注意插入到哈希表中的数据,取更大的并集即可。
题目:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
##这有个注意的点,要求返回一个二维指针,代表每个返回的二维数组的数量,这个分配空间应该用*returnsize=malloc(sizeof(int*));
代码:
/**
* 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().
*/
typedef struct dd{
int key;
int val;
UT_hash_handle hh;
}DD;
DD *data=NULL;
int cmpkey(DD *a,DD *b){
return a->key-b->key;
}
void insertData(int pre,int next){
DD *find=NULL;
HASH_FIND_INT(data,&pre,find);
if(find==NULL){
find=(DD*)malloc(sizeof(DD));
find->key=pre;
find->val=next;
HASH_ADD_INT(data,key,find);
}else{
if(find->val<next){
printf("非空\n");
find->val=next;
}
}
}
int** insert(int** intervals, int intervalsSize, int* intervalsColSize, int* newInterval, int newIntervalSize, int* returnSize, int** returnColumnSizes){
int **res=(int**)malloc((intervalsSize+5)* sizeof(int**));
//int *flag=(int*)malloc(intervalsSize*sizeof(int));
int flag=0;
int j=0;
int i;
for(i=0;i<intervalsSize;i++){
//printf("intervals-0:%d\tintervals-1:%d\n",intervals[i][0],intervals[i][1]);
if(!(newInterval[0]>intervals[i][1]) && !(newInterval[1]<intervals[i][0])){
flag=1;
// res[j]=(int*)malloc(2*sizeof(int));
// res[j][0]=newInterval[0]<intervals[i][0]?newInterval[0]:intervals[i][0];
// res[j][1]=newInterval[1]>intervals[i][1]?newInterval[1]:intervals[i][1];
insertData(newInterval[0]<intervals[i][0]?newInterval[0]:intervals[i][0],newInterval[1]>intervals[i][1]?newInterval[1]:intervals[i][1]);
newInterval[0]=newInterval[0]<intervals[i][0]?newInterval[0]:intervals[i][0];
newInterval[1]=newInterval[1]>intervals[i][1]?newInterval[1]:intervals[i][1];
}else{
// res[j]=(int*)malloc(2*sizeof(int));
// res[j][0]=intervals[i][0];
// res[j][1]=intervals[i][1];
insertData(intervals[i][0],intervals[i][1]);
}
}
if(flag==0){
insertData(newInterval[0],newInterval[1]);
}
HASH_SORT(data,cmpkey);
DD *iter;
int k=0;
for(iter=data;iter!=NULL;iter=iter->hh.next){
res[k]=(int*)malloc(2*sizeof(int));
res[k][0]=iter->key;
res[k][1]=iter->val;
k++;
}
free(data);
data=NULL;
*returnSize=k;
*returnColumnSizes = malloc(sizeof(int*) * (intervalsSize+1));
for(i=0;i<intervalsSize+1;i++){
(*returnColumnSizes)[i] = 2;
}
return res;
}