N37合并区间

题目链接:https://www.nowcoder.com/share/jump/8109288801719904170940

题目要求:给出一组区间,请合并所有重叠的区间。

请保证合并后的区间按区间起点升序排列。

数据范围:区间组数 0≤𝑛≤2×1050≤n≤2×105,区间内 的值都满足 0≤𝑣𝑎𝑙≤2×1050≤val≤2×105

要求:空间复杂度 𝑂(𝑛)O(n),时间复杂度 𝑂(𝑛𝑙𝑜𝑔𝑛)O(nlogn)

进阶:空间复杂度 𝑂(𝑣𝑎𝑙)O(val),时间复杂度𝑂(𝑣𝑎𝑙)O(val)

样例:输入:[[10,30],[20,60],[80,100],[150,180]]

输出:[[10,60],[80,100],[150,180]]

因为编辑器一直报错所以本地写了


/**解题思路:
 * 第一步:把数组按照每个区间的起点从小到大排序;
 * 第二步:定义一个空数组resultArr接收合并后的区间
 * 第三步:遍历第一步中的数组,如果resultArr为空或者元素的起点大于resultArr最后一个元素的末点,则加入到resultArr中
 * 第四步:不满足第三步的元素,代表元素的起点小于resultArr中最后一个元素的末点,证明区间重叠,则需要把resultArr中最后一个元素的末点替换成(新元素区间末点和resultArr中最后一个元素的末点中大的那位)
 */
 function mergeArray(intervals: Array<Array<number>>) {
  if (intervals.length === 0) {
    return [];
  } else {
    intervals.sort((a, b) => {
      return a[0] - b[0];
    });
    const resultArr: Array<Array<number>> = [];
    intervals.forEach((item) => {
      if (resultArr.length === 0 || item[0] > resultArr[resultArr.length - 1][1]) {
        resultArr.push(item);
      } else {
        resultArr[resultArr.length - 1][1] = Math.max(Number(item[1]), Number(resultArr[resultArr.length - 1][1]));
      }
    });
    return resultArr;
  }
}
//参数在规定形式内可以传任意区间
mergeArray([[10,30],[20,60],[80,100],[150,180]]);

全部评论

相关推荐

我:“加班需要有加班工资。”&nbsp;hr:“为什么?”&nbsp;哈哈哈哈哈哈哈离大谱
juntenor:你确实太理想化了,对社会不了解呀。这个和HR没有关系,这是国内特色,不然怎么还会有外包就这种逆天的存在呢。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-28 12:15
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务