【LeetCode每日一题】56. 合并区间&&插入区间

一、判断区间是否重叠

力扣 252. 会议室

给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervalsi = starti, endi ,请你判断一个人是否能够参加这里面的全部会议。

思路分析

因为一个人在同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间,将区间按照会议开始时间进行排序,然后遍历一遍判断即可。

代码实现

js 复制代码
var canAttendMeetings = function (intervals) {
  // 先根据最小值进行排序。
  intervals.sort((a, b) => a[0] - b[0]);
  for (let i = 1; i < intervals.length; i++) {
    if (intervals[i][0] < intervals[i - 1][1]) {
      return false;
    }
  }
  return true;
};

二、合并区间

56.合并区间
https://leetcode.cn/problems/merge-intervals/description/

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

js 复制代码
/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
		// 先根据最小值进行排序。
    intervals.sort((a, b) => a[0] - b[0]);
    let merged = [intervals[0]];
    for (let i = 1; i < intervals.length; i++) {
        if(intervals[i][0] > merged[merged.length - 1][1]){
            merged.push(intervals[i]);
        }else{
            merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], intervals[i][1]);
        }

    }
    return merged;
};

57. 插入区间

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

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

思路一:

先根据区间的起始找到插入的位置,

再对区间进行遍历,对区间进行合并。

js 复制代码
/**
 * @param {number[][]} intervals
 * @param {number[]} newInterval
 * @return {number[][]}
 */
var insert = function(intervals, newInterval) {
    let i = 0;
    for(i = 0; i < intervals.length; i++){
        if(newInterval[0] < intervals[i][0]){
            intervals.splice(i, 0, newInterval);
            break;
        }
    }
    if(i === intervals.length){
        intervals.push(newInterval);
    }
    // 进行合并
    let merged = [intervals[0]];

    for(let i = 1; i < intervals.length ; i++){
        if(intervals[i][0] <= merged.at(-1)[1]){
            merged.at(-1)[1] = Math.max(merged.at(-1)[1], intervals[i][1]);
        }else{
            merged.push(intervals[i]);
        }
    }
    return merged;
};

思路二:

初始化结果区间merged = \[\]

遍历到某个区间:

  • 如果这个区间在new区间的左边且没有交集,则将该区间加入到merged;
  • 如果这个区间是在new区间的右边,并且是第一次出现,则将new区间加入merged,并且也将该区间加入到merged;
  • 如果这个区间是在new区间的右边,但是不是第一次出现,因为之前已经将new区间加入到merged 了,所以这次只需要将该区间加入到merged;
  • 如果不是以上的情况,说明new和该区间有交集,维护new区间的left 和right。
js 复制代码
var insert = function (intervals, newInterval) {
  let [left, right] = newInterval; // 解构赋值,将newInterval的值分别赋给left和right变量。]
  let merged = [];
  let flag = true; // 判断是否需要插入
  for (let i = 0; i < intervals.length; i++) {
    const [start, end] = intervals[i];
    if (end < left) {
      merged.push(intervals[i]);
    } else if (start > right) {
      if (flag) {
        merged.push([left, right]);
        flag = false;
      }
      merged.push(intervals[i]);
    } else {
      left = Math.min(left, start);
      right = Math.max(right, end);
    }
  }
  if (flag) {
    merged.push([left, right]);
  }
  return merged;
};
相关推荐
江畔柳前堤4 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore5 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考6 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX7 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面8 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号8 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽8 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI8 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者10 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者10 小时前
【征程6】校准量化中HistogramObserver解析
算法