NC37 合并区间【牛客网】

零、原题链接


NC37 合并区间

一、题目描述

在这里插入图片描述

二、测试用例

在这里插入图片描述

三、解题思路

  1. 基本思路:
      申请一个 val 大小的空间,对于一个区间,我们在区间开始位置的下标存放区间结束位置,如果对于位置已存在数字,则取二者最大值。这样在遍历区间时,如果遇到一个区间开始,则读取其结束位置,判断与当前区间结束位置谁更大,如果比当前结束位置大,则更新区间结束位置,否则不更新,直到遍历到结束位置,这样就成功合并一个区间,从到到尾遍历一篇,则所有能合并区间都合并。
  2. 具体思路:
    • 申请一个 val 大小的向量,初始化为 -1 ;
    • 遍历所有区间,数组下标表示区间开始,数组内容表示区间结束;
    • 遍历数组,
      • 如果是 -1 ,则跳过;
      • 如果非 -1 ,则开始合并区间;
        • 更新遍历范围为数组值,即区间的结束
        • 遍历,如果遇到非 -1 ,则表示碰到一个可合并的区间,取其结束位置,如果比当前结束位置远,则更新结束位置
      • 合并区间结束,则将区间存放到 ans 中。
    • 返回答案 ans 。

四、参考代码

时间复杂度: O ( v a l ) \Omicron(val) O(val)
空间复杂度: O ( v a l ) \Omicron(val) O(val)

/**
 * struct Interval {
 *  int start;
 *  int end;
 *  Interval(int s, int e) : start(start), end(e) {}
 * };
 */
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param intervals Interval类vector
     * @return Interval类vector
     */
    vector<Interval> merge(vector<Interval>& intervals) {
        int _max = 200001;
        vector<int> vec(_max, -1);
        vector<Interval> ans;

        for (int i = 0; i < intervals.size(); i++) {
            vec[intervals[i].start] = max(vec[intervals[i].start], intervals[i].end);
        }

        for (int i = 0; i < _max; i++) {
            if (vec[i] == -1)
                continue;
            Interval t;
            t.start = i;
            t.end = vec[i];

            while (i <= t.end) {
                t.end = max(t.end, vec[i]);
                i++;
            }
            i--;

            ans.emplace_back(t);
        }

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值