寻找右区间-c语言快速排序加二分查找
给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。
区间 i 的 右侧区间 可以记作区间 j ,并满足 startj >= endi ,且 startj 最小化 。
返回一个由每个区间 i 的 右侧区间 的最小起始位置组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。
示例 1:
输入:intervals = [[1,2]]
输出:[-1]
解释:集合中只有一个区间,所以输出-1。
示例 2:
输入:intervals = [[3,4],[2,3],[1,2]]
输出:[-1,0,1]
解释:对于 [3,4] ,没有满足条件的“右侧”区间。
对于 [2,3] ,区间[3,4]具有最小的“右”起点;
对于 [1,2] ,区间[2,3]具有最小的“右”起点。
示例 3:
输入:intervals = [[1,4],[2,3],[3,4]]
输出:[-1,2,-1]
解释:对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。
对于 [2,3] ,区间 [3,4] 有最小的“右”起点。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void q_sort(int *a,int *b,int low,int high){
int l=low,h=high;
if(low<high){
int pb=b[low];
int p=a[low];
while(low<high){
while(low<high&&a[high]>=p){
high--;
}
a[low]=a[high];
b[low]=b[high];
while(low<high&&a[low]<=p){
low++;
}
a[high]=a[low];
b[high]=b[low];
}
a[low]=p;
b[low]=pb;
q_sort(a,b,l,low-1);
q_sort(a,b,low+1,h);
}
}
int B_find(int key,int *a,int low,int high){
printf("lh %d %d",low,high);
int mid=(low+high)/2;
int index=-1;
if(low==high) return low;
if(a[mid]>=key){
if(a[mid]==key){
return mid;
}
high=mid;
index=B_find(key,a,low,high-1);
}
else{
low=mid;
index=B_find(key,a,low+1,high);
}
return index;
}
int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize){
int *right_end=(int *)malloc(sizeof(int )*intervalsSize);
int* left_start=(int *)malloc(sizeof(int )*intervalsSize);
int *landmark=(int *)malloc(sizeof(int )*intervalsSize);
int i=0;
int *re=(int *)malloc(sizeof(int )*intervalsSize);
for(i=0;i<intervalsSize;i++){
right_end[i]=intervals[i][1];
left_start[i]=intervals[i][0];
landmark[i]=i;
}
q_sort(left_start,landmark,0,intervalsSize-1);
for(i=0;i<intervalsSize;i++){
printf("right_end %d ",right_end[i]);
if(left_start[0]>right_end[i]||left_start[intervalsSize-1]<right_end[i]){
re[i]=-1;
continue;
}
int index=B_find(right_end[i],left_start,0,intervalsSize-1);
printf("index %d %d ",index,landmark[index]);
if(index==-1){
re[i]=-1;
}
re[i]=landmark[index];
if(left_start[index]<right_end[i]){
re[i]=landmark[index+1];
}
// printf("%d %d ",left_start[i],landmark[i]);
}
right_end[0]=-1;
* returnSize=intervalsSize;
return re;
}