题解 | #合并区间#

合并区间

https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a

2022.0902算法第51题合并区间
这题在写代码时遇到一下困难:
1、每两个区间进行比较,这样总会少一个区间,例如从第一个开始,则最后一个就可能遍历不到
    这样想的思路是有问题的,因为需要比较的是结果区间的最后一个元素和给定区间依次比较,这样是不涉及数组问题。
2、在添加到结果数组时,如果连着三个都是需要合并的区间,那么怎么比?比较的对象就应该是结果数组中的最后一个区间
    也就是结果数组的最后一个区间与给定的区间进行依次比较。
以上两个问题,没有想明白,导致写代码时总是出错,可以看出,以上两个问题出现的原因还是具体实施细节有问题
直到先排序,然后将能合并的区间进行合并,但是这个怎么合并就需要仔细思考了
还是有好多问题需要注意。现在在想觉着但是怎么就想不明白呢。。。(加练)
还有一点关于谓词的,需要使用静态函数才能充当谓词(函数指针),否则会报错。
//谓词,用于对区间排序,按左边界升序排列
//这里需要使用静态函数,要不设置为全局函数也行,应该是函数指针的问题
//静态函数指针和普通函数指针是不一样的
static bool isG(const Interval &v1,const Interval &v2){
    return v1.start<v2.start;
}
vector<Interval> merge(vector<Interval> &intervals) {
    //定义结果数组
    vector<Interval> res;
    //如果没有区间,或者只有一个区间,则直接返回
    if(intervals.size()<=1)
        return intervals;
    //对区间进行排序,按左边界升序排列
    sort(intervals.begin(),intervals.end(),isG);
    //首先将第一个加入结果数组,这里感觉和动态规划相似
    res.push_back(intervals[0]);
    //进行遍历区间,每次是结果数组中的最后一个区间和当前区间作比较
    for(int i=1;i<intervals.size();i++){
        //结果数组中的最后一个区间的右边界和当前区间左边界作比较
        //如果左边界小于等于右边界,那么能够合并区间
        //将结果数组里的右边界更新为两个边界中较大的值。
        if(intervals[i].start<=res.back().end){
            //res.pop_back();
            res.back().end= max(res.back().end,intervals[i].end);
        }
        //否则,不能合并区间,则直接加入到结果数组
        else
            res.push_back(intervals[i]);
    }
    //返回结果
    return res;
}




#算法题#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务