LeetCode面试题Day16|LC56 合并区间、LC57 插入区间

题目一:

指路:

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

思路与分析:

本题题意清晰易懂,当区间有重叠元素时返回能覆盖这些重叠区间的大区间,否则就返回无重叠区间。那么判断区间是否有重叠只需要按照区间各自的左边界升序排序,如果前一个区间的右边界大于后一个区间的左边界时则说明当前两区间有重叠元素。那么在将答案添加进结果集时,按照区间左边界升序之后,第一个区间的左边界一定是最小的,可以直接添加进结果集,那么添加右边界时需要判断判断一下哪个区间有较大的右边界,返回即可,最后添加无重叠元素的单个区间。

代码:

cpp 复制代码
class Solution {
    static bool cmp(vector<int>& a, vector<int>& b) {
        return a[0] < b[0];  // 根据左边界排序
    }
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;  // 最终结果集
        vector<int> path;
        if (intervals.size() == 0) return result;
        sort(intervals.begin(), intervals.end(), cmp);
        result.push_back(intervals[0]);  // 
        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) {  //
            // 末尾元素的右边界 >= 当前元素左边界(两区间有重叠)
                result.back()[1] = max(result.back()[1], intervals[i][1]);
                // 右边界 = 最大的右边界
            } else {
                result.push_back(intervals[i]);  // 无重叠的区间
            }
        }
        return result;
    }
};

题目二:

指路:

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

思路与分析:

本题中,我们可以读出的信息是:1.给定的若干个区间无重叠(上一个区间的右边界小于下一个区间的左边界);2.给定的若干个区间已经按照左边界升序排序;3.需要在给定的区间插入给定的新区见使插入后的区间依旧按照左边界排序同时各个区间无重叠(这就要求加入的区间左边界大于原某一区间的右边界而加入区间的右边界小于原某一区间的左边界);4.必要时可以合并区间意为当与第三条发生冲突时将两区间合并得到一个新区间从而满足第三条。那么我们将原区间与加入区间的情况分为以下几种,原某一区间在加入区间的右侧,当需要加入的区间还未加入时,那么我们可以直接加入需要加入的区间继而加入原区间的左右区间;又或是原区间在需要加入区间的左边二者依旧无重叠,此时返回原区间的左右边界继而返回新加入区间的左右边界;最后是两区间有重叠,此时需要返回较小的左边界和较大的右边界。

代码:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> ans;
        bool placed = false;
        for (int i = 0; i < intervals.size(); i++) {
            if (intervals[i][0] > newInterval[1]) {  // 在插入区间的右侧无重叠
                if (!placed) {  // 
                    ans.push_back({newInterval[0], newInterval[1]}); 
                    placed = true;
                } 
                ans.push_back({intervals[i][0], intervals[i][1]});
                } else if (intervals[i][1] < newInterval[0]) {  // 无重叠
                    ans.push_back({intervals[i][0], intervals[i][1]});
                } else {  // 返回较小左边界和较大右边界
                    newInterval[0] = min(newInterval[0], intervals[i][0]);
                    newInterval[1] = max(newInterval[1], intervals[i][1]);
                }
            }
            if (!placed) {  // 
                ans.push_back({newInterval[0], newInterval[1]});
            }
        return ans;
    }
};
相关推荐
A懿轩A4 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神5 分钟前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人8 分钟前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
机器视觉知识推荐、就业指导9 分钟前
C++设计模式:享元模式 (附文字处理系统中的字符对象案例)
c++
半盏茶香9 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.1 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
Ronin3051 小时前
11.vector的介绍及模拟实现
开发语言·c++
✿ ༺ ོIT技术༻1 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
字节高级特工1 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
tinker在coding3 小时前
Coding Caprice - Linked-List 1
算法·leetcode