算法刷题 DAY36

本文介绍了三个与区间操作相关的C语言函数:比较区间结束时间的intcmp,用于合并并删除重叠区间的merge,以及划分字符区间并记录每段元素数的partitionLabels。通过qsort对区间进行排序是这些功能的核心部分。
摘要由CSDN通过智能技术生成

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值