• [LeetCode]Merge Intervals


    题目:Merge Intervals

    给定n个区间合并重合区间

    思路:

    先按照区间起点排序,然后合并下面情况:

    1.起点相同,以最大的终点为新的终点;

    2.前一个终点大于后一个的起点。

    /***************************************************************************************************
    Given a collection of intervals, merge all overlapping intervals.
    For example,
    Given [1,3],[2,6],[8,10],[15,18],
    return [1,6],[8,10],[15,18].
    ***************************************************************************************************/
    #include<stdio.h>
    
    struct Interval {
        int start;
        int end;
    };
    
    /*按区间起点排序*/
    int cmp(const void *a , const void *b){
        struct Interval *intval1 = (struct Interval *)a;
        struct Interval *intval2 = (struct Interval *)b;
    
        return intval1->start - intval2->start;
    }
    
    /**
     * Definition for an interval.
     * struct Interval {
     *     int start;
     *     int end;
     * };
     */
    /**
     * Return an array of size *returnSize.
     * Note: The returned array must be malloced, assume caller calls free().
     */
    struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
            if(intervalsSize == 0){//数组为0
                *returnSize = 0;
                return NULL;
            }
            if(intervalsSize == 1){//只有一个区间
                *returnSize = 1;
                struct Interval *retIntv = (struct Interval*)malloc(sizeof(struct Interval));
                retIntv[0].start = intervals[0].start;
                retIntv[0].end = intervals[0].end;
                return retIntv;
            }
            qsort(intervals,intervalsSize,sizeof(struct Interval),cmp);//排序
    
        int length = 0,end = 0;
        int *starts = (int *)malloc(intervalsSize*sizeof(int));
        int *ends = (int *)malloc(intervalsSize*sizeof(int));
        memset(starts,-1,intervalsSize*sizeof(int));
        memset(ends,-1,intervalsSize*sizeof(int));
        for(int i = 0;i < intervalsSize;i++){
            starts[length] = intervals[i].start;
            ends[length] = intervals[i].end;
            while(i < intervalsSize - 1 && ends[length] >= intervals[i + 1].start){//合并前一个终点大于后一个的起点的区间
                i++;
                ends[length] = ends[length] > intervals[i].end ? ends[length] : intervals[i].end;
            }
            length++;
        }
    
        struct Interval *retIntv = (struct Interval*)malloc(length*sizeof(struct Interval));
        for(int i = 0;i < length;i++){
            retIntv[i].start = starts[i];
            retIntv[i].end = ends[i];
        }
    
        free(starts);
        free(ends);
        *returnSize = length;
        return retIntv;
    }
    
    void main(){
        //[1,3],[2,6],[8,10],[15,18]
        //[1,6],[2,3],[8,10],[15,18]
        //[1,6],[8,10],[2,3],[15,18]
        struct Interval *intervals = (struct Interval *)malloc(1*sizeof(struct Interval));
        intervals[0].start = 1;
        intervals[0].end = 6;
        //intervals[1].start = 5;
        //intervals[1].end = 10;
        //intervals[2].start = 2;
        //intervals[2].end = 3;
        //intervals[3].start = 15;
        //intervals[3].end = 18;
        int length = 0;
        struct Interval *retIntv = merge(intervals,1,&length);
        for(int i = 0;i < length;i++){
            printf("[%d,%d]
    ",retIntv[i].start,retIntv[i].end);
        }
        free(intervals);
        free(retIntv);
    }
  • 相关阅读:
    oracle计算记录条数
    oracle 尽量多使用COMMIT
    oracle 用TRUNCATE替代DELETE
    oracle 删除重复记录
    oracle整合简单,无关联的数据库访问
    oracle使用DECODE函数来减少处理时间
    oralce 减少访问数据库的次数
    古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝
    C#中HttpWebRequest与HttpWebResponse的使用方法
    C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/6670543.html
Copyright © 2020-2023  润新知