2021-5-27合并区间

主题:

学习记录,内容

  • 算法题:合并区间

内容:

1 合并区间
问题描述:
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
思路:
要先进行排序,是对于Interval的排序。按照地一个元素升序进行排序。实现排序
最简单的办法就是使用sort这个函数,重写compare函数。注意应该怎么写。返回值最好是
bool类型的。当a>b返回true时,那么就会是降序的排列。如果是false,那么就是降序的排列。
1可以替代true,0可以替代false。(非零即为true)

排玩序之后需要进行合并,合并需要“累积合并”。也就是之前合并的结果来和下一个interval进行合并。
合并之后要决定是直接添加到res里面,还是把旧的扔掉,然后进行新的,也就是进行更新。
或者是不需要进行变更。(为了简单,不须变更的情况也作为更新的情况)
有三种基本的情况,这里做图理解是一个非常好的办法。很多问题都需要进行做图理解,会更好理解。

代码:


vector<Interval> merge(vector<Interval> &intervals) {
        if(intervals.size()<=1)
        {
            return intervals;
        }
        //需要将Interval进行排序
        sort(intervals.begin(), intervals.end(),compare);
        
        //进行合并
        vector<Interval> res;
        Interval v = intervals[0];
        Interval temp;
        res.push_back(v);
        for(unsigned long i=1;i<intervals.size();i++)
        {
            temp = v;
            v = merge(v, intervals[i]);
            if(v.start == temp.start && v.end == intervals[i].end || v.start == temp.start && v.end == temp.end)
            { //没有进行合并
                res.pop_back();
                res.push_back(v);
            }
            else{ //有合并
                res.push_back(v);
            }
        }
        return res;
    }
    
    static bool compare(Interval& i1, Interval& i2)
    {
        return i1.start<i2.start; //这个函数返回值可以是int,也可以是bool,可以正排,也可以倒排
    }
    
    Interval merge(Interval&v1, Interval& v2) //对两个Interval进行合并
    {
        if(v2.start <= v1.end)
        {
            if(v2.end < v1.end)
            {
                return v1;
            }
            else{
                return Interval(v1.start, v2.end);
            }
        }
        else{
            return v2;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值