LeetCode 每日一题 2020-11-4 (插入区间)

57. 插入区间

难度困难

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

思路1:

遍历原始区间,将需要新加入的区间与当前所在区间对比,根据比较结果选择性添加区间情况。

情况1:新区间在当前区间右侧(无交集) -》 将当前区间加入结果;

情况2:新区间在当前区间左侧(无交集) -》 将新区间加入结果,再将剩余的全部区间加入结果;

情况3:新区间与当前区间存在交集            -》 更新新区间的范围,变为两个区间的交集;

情况1和情况3存在边界情况:若当区间已属于原区间的最后一部分,需要将新区间加入到结果中。

    vector<vector<int>> insert(vector<vector<int>>& list, vector<int>& add) {   

        int len=list.size();

        if(!len) {

            return vector<vector<int>>(1,add);

        }

        vector<vector<int>> ans;

        for(int i=0;i<len;++i){

            if(list[i][1]<add[0]) {

                ans.push_back(list[i]);

                if(i==len-1) ans.push_back(add);

            }

            else if(list[i][0]>add[1]){

                ans.push_back(add);

                while(i<len){

                    ans.push_back(list[i++]);

                }

                break;

            }

            else{

                add[0]=min(list[i][0],add[0]);

                add[1]=max(list[i][1],add[1]);

                if(i==len-1) ans.push_back(add);

            }

        }

        return ans;

    }

思路2:三个月前解答,思路重理ing。。。

 

 

    vector<vector<int>> insert(vector<vector<int>>& list, vector<int>& add) {   // 内存占用过大,尝试使用原向量解答

        vector<vector<int>> res;

        if(!list.size()) {res.push_back(add); return res;}

        bool flg=false;

        if(list[0][0]>add[0]){flg=true; res.push_back(add);}

        else res.push_back(list[0]);

        for(auto vec:list){

            if( add[0] >res.back()[1]  && add[0]<vec[0] && !flg) { flg=true; res.push_back(add);}

            if( add[1]<vec[0] || !flg ){ 

                if(vec[0]>res.back()[0] ) res.push_back(vec);

            }

            if((add[0]>=res.back()[0] && add[0]<=res.back()[1])||(add[1]>=res.back()[0] && add[1]<=res.back()[1])

            ||(add[0]<=res.back()[0] && add[1]>=res.back()[1])){

                res.back()[0]=min(res.back()[0],min(add[0],vec[0]));

                res.back()[1]=max(res.back()[1],max(add[1],vec[1]));

                flg=true;

            }

        }

        if(!flg) res.push_back(add);

        return res;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值