当前位置: 首页 > news >正文

合并区间、插入区间~

56. 合并区间 - 力扣(LeetCode)

首先是合并区间,这道题是ACwing的模板题,其实我有点想不通为什么要把一道模拟题做成模板,直到今年科软机试考了这道题,感觉这道题确实是面试和机试的高频考点:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end());
        int start = -2e9;
        int end = -2e9;
        vector<vector<int>> res;
        for(auto interval : intervals){
            int newstart = interval[0];
            int newend = interval[1];
            if(newstart > end){
                if(start != -2e9) res.push_back({start,end});
                start = newstart; end = newend;
            }else{
                end = max(end , newend);
            }
        }
        if(start != -2e9) res.push_back({start,end});
        return res;
    }
};

我这里也是直接背模板,首先我们要sort一下(听说科软机试是纯c,没有内置sort函数。。)然后声明start和end为非常小的值,其实也是把[start,end]当作第一个区间,然后开始遍历每一个新区间,这里就分两种大情况:

一种是新区间的左端点要大于上一个区间的右端点,就没有交集。这时候判断一下,如果start不是当初那个极小值就把维护的这一段区间加入到结果中,然后转而去用start和end维护新区间。

另一种是新区间的左端点小于上一个区间的右端点,这时就有了交集,让end=max(end,newend)实际上还包括了两种小情况。没有接触过这道题的读者可以想一想是哪两种小情况。

最后遍历结束后,别忘了把最后一个维护的区间加入。

因为他每回插入答案的都是上一个维护的区间,所以导致在最后维护的新区间不会插入到结果中。

57. 插入区间 - 力扣(LeetCode)

这里有一个非常偷懒的做法:就是直接copy上一题的代码,然后把新区间插入到区间集合里面进行区间合并,而且由于本来就是有序的,所以sort一下好像不会花太多时间。但是这样就没有利用到有序的特性。

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        intervals.push_back(newInterval);
        sort(intervals.begin(),intervals.end());
        int start = -2e9;
        int end = -2e9;
        vector<vector<int>> res;
        for(auto interval : intervals){
            int newstart = interval[0];
            int newend = interval[1];
            if(newstart > end){
                if(start != -2e9) res.push_back({start,end});
                start = newstart; end = newend;
            }else{
                end = max(end , newend);
            }
        }
        if(start != -2e9) res.push_back({start,end});
        return res;
    }
};

更好的做法是这一种:

但是这种模拟题需要思维逻辑特别清晰,我不一定能想到

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        int left = newInterval[0];
        int right = newInterval[1];
        bool placed = false;
        vector<vector<int>> ans;
        for (const auto& interval: intervals) {
            if (interval[0] > right) {
                // 在插入区间的右侧且无交集
                if (!placed) {
                    ans.push_back({left, right});
                    placed = true;                    
                }
                ans.push_back(interval);
            }
            else if (interval[1] < left) {
                // 在插入区间的左侧且无交集
                ans.push_back(interval);
            }
            else {
                // 与插入区间有交集,计算它们的并集
                left = min(left, interval[0]);
                right = max(right, interval[1]);
            }
        }
        if (!placed) {
            ans.push_back({left, right});
        }
        return ans;
    }
};

这个placed标记新区间是否被插入。大伙看一下注释吧。

1.如果当前遍历的区间的右端点在新区间左端点左边,就没有交集。

2.发现第一个满足区间左端点大于新区间右端点的区间,如果新区间没插入就把left和right维护的中间一大坨插入,再插入这个区间。

3.其他情况就是有交集,计算并集维护这一坨区间。

在遍历结束后,特判新区间有没有插入,如果没有的话说明新区间足够大把后面的区间全部覆盖了。所以最后我们插入维护的区间结束。

http://www.dtcms.com/a/126298.html

相关文章:

  • 【LLM基础】Megatron-LM相关知识(主要是张量并行机制)
  • 无线通信网
  • leetcode 322. Coin Change
  • 谷歌25年春季新课:15小时速成机器学习
  • 【2025年认证杯数学中国数学建模网络挑战赛】C题 数据预处理与问题一二求解
  • 如何使用CAPL解析YAML文件?
  • Python爬虫第13节-解析库pyquery 的使用
  • C++ | 时间日期
  • WEB 前端学 JAVA(一)
  • Qwen2.5-7B-Instruct FastApi 部署调用教程
  • YOLO学习笔记 | YOLOv8 全流程训练步骤详解(2025年4月更新)
  • 知行之桥2025版账号密码修改和重置指南
  • .NET WPF 可视化树(Visual Tree)
  • MCP工具的配置文件格式是怎么样的?MCP教程平台推荐
  • RVOS-3.实现内存管理
  • Compose 适配 - 响应式排版 自适应布局
  • 基于SpringBoot的智慧社区管理系统(源码+数据库)
  • 蓝桥杯单片机刷题——通过按键触发串口传输电压值
  • 这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件
  • 【力扣hot100题】(075)数据流的中位数
  • 2025年3月GESPC++三级考级真题——2025
  • Elasticsearch 系列专题 - 第六篇:高级功能与生态系统
  • P8627 [蓝桥杯 2015 省 A] 饮料换购
  • Linux用户切换命令区别详解
  • 【JDBC-54】JDBC:Java数据库连接的桥梁与核心特性解析
  • 进度计划频繁变更,如何稳定推进
  • 【含文档+PPT+源码】基于微信小程序的小区物业收费管理系统
  • 【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南
  • Windows下编译SALOME
  • spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵