57. 插入区间

##第一道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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值