435.无重叠区间
//思路同气球
int cmp(const void* p1,const void* p2){
int *pp1=*(int**)p1;
int *pp2=*(int**)p2;
return pp1[0]>pp2[0];
}
int eraseOverlapIntervals(int** points, int pointsSize, int* pointsColSize){
if(pointsSize==0||pointsSize==1) return 0;//0,1个区间→不用删除
qsort(points,pointsSize,sizeof(int*),cmp);
int result=0;
for(int i=1;i<pointsSize;i++){
if(points[i][0]>=points[i-1][1]) continue;//边界重叠不算重叠
else{
result++;//区间重叠→删除右边界最右的
points[i][1]=fmin(points[i][1],points[i-1][1]);//更新右边界
}
}
return result;
}
763.划分字母区间
int* partitionLabels(char* s, int* returnSize) {
int hash[26]={0};
int len=strlen(s);
int max_index=0;//分割点
int* res=(int*)calloc(500,sizeof(int));
int res_index=0;
int count=0;//每段元素数
(*returnSize)=0;
for(int i=0;i<=len-1;i++){
hash[s[i]-'a']=i;//记录每个元素所能达到的最远下标
}
for(int i=0;i<=len-1;i++){
count++;
max_index=fmax(max_index,hash[s[i]-'a']);.//更新分割点
if(max_index==i) {//达到分割点→进行分割
res[res_index++]=count;
count=0;//初始化计数器和max_index;
max_index=0;
}
}
(*returnSize)=res_index;
return res;
}
56. 合并区间
int cmp(const void* p1,const void* p2){
int *pp1=*(int**)p1;
int *pp2=*(int**)p2;
return pp1[0]>pp2[0];
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize,
int* returnSize, int** returnColumnSizes) {
(*returnSize) = intervalsSize;//size为0/1时特殊处理
if (intervalsSize == 0)
return NULL;
int** res = (int**)calloc(10000, sizeof(int*));
int res_index = 0;
(*returnColumnSizes) = (int*)calloc(10000, sizeof(int));
for (int i = 0; i < 10000; i++) {
(*returnColumnSizes)[i] = 2;
}
qsort(intervals,intervalsSize,sizeof(int*),cmp);
res[res_index] = intervals[0];//先压入第一个区间
//printf("res[res_index][0]=%d\n",res[res_index][0]);
if (intervalsSize == 1) {
return res;
}
for (int i = 1; i < intervalsSize; i++) {
if (intervals[i][0] > res[res_index][1]) {//区间不重叠时则将新区间压入
res_index++;
res[res_index]=intervals[i];
}
else{//区间重叠有有→更新右边界为最大值
res[res_index][1]=fmax(res[res_index][1],intervals[i][1]);
}
}
(*returnSize)=res_index+1;//要+1
return res;
}