【leetcode 力扣刷题】汇总区间//合并区间//插入区间

这篇具有很好参考价值的文章主要介绍了【leetcode 力扣刷题】汇总区间//合并区间//插入区间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

228. 汇总区间

题目链接:228.汇总区间
题目内容:【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
看题目真是没懂这个题到底是要干啥……实际上题目要求的恰好覆盖数组中所有数字最小有序区间范围列表,这个最小是指一个区间范围小。比如能够覆盖{2,3,4,6}的区间可以是[2,6],但是5在区间内,却不在数组内,因此这个区间不是最小的,可以缩小成[2,4]和[6,6],这才是满足题意恰好覆盖所有数字的最小区间。
理解题意后,解法就很简单了,为了保证区间能够覆盖所有数组中的数字,同时又不存在在区间内但不在数组内的数字,那就只能考虑用数组内的连续数字来组成区间。什么意思呢?就是把数组内连续的数字组成一个区间,单独的数字单独一个区间。比如上面的{2,3,4,6},其中{2,3,4}就是连续的,组成一个区间[2,4],6是单独的需要一个区间[6, 6]。由于数组本身是有序的,那么就找连续递增的数字组成一个区间,nums[j] == nums[j-1]。 代码如下(C++):

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        vector<string> ans;
        int start = 0, end = 1;
        while(end <= nums.size()){
            //end是连续区间结束后的数字
            if(end == nums.size() || nums[end] != nums[end - 1] + 1){
                if(start == end - 1)
                    //如果start和end-1相等,说明这是只有一个数字的独立区间
                    ans.emplace_back(to_string(nums[start]));
                else
                    //start到end-1是连续区间
                    ans.emplace_back(to_string(nums[start])+"->"+to_string(nums[end-1]));
                start = end;  //下一段区间的开始 
            }
            end++;         
        }
        return ans;
    }
};

56. 合并区间

题目链接:56. 合并区间
题目内容:
【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
先看看给的例子,理解题意:
【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
题目要求我们合并重叠的区间,那什么算是重叠的区间呢?在区间是按照左端点升序排序的前提下,前面一个区间d1的右端点与后面一个区间d2的左端点有交集,即d1.right ≥ d2.left,就说明两个区间重叠,至于d2.right与d1.right的大小关系,是不重要的:
【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
d1和d2有交集,将两个区间合并成[ min(d1.left,d2.left),max(d1.right,d2.right) ]。
所以首先要做的是将区间数组按照区间的左端点排序,之后开始判断前后两个区间是否有重叠。判断是否重叠只需要将答案区间数组中最后一个区间和待加入的区间比较,因为当前答案数组的最后一个区间的left是比待加入的区间left更小的,答案区间数组中的区间是没有重叠的,那么答案数组中的最后一个区间的left肯定是大于再前面一个区间的right的,待加入区间的left肯定是比答案数组中倒数第二个区间的right更大的。代码如下(C++):

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size() == 0)
            return intervals;
        sort(intervals.begin(), intervals.end()); //排序,左端点升序
        vector<vector<int>> ans; //最终无重叠的区间数组
        for(int i = 0; i < intervals.size(); i++){
        	//对于第一个区间和不重叠的区间,直接加入
            if(ans.size() ==0 || ans.back()[1] < intervals[i][0])
                ans.emplace_back(intervals[i]);
            else
            	//有重叠的区间,最后一个区间的right要修改为两个重叠区间更大的right
                ans.back()[1] = max(intervals[i][1], ans.back()[1]);
        }
        return ans;
    }
};

57. 插入区间

题目链接:57. 插入区间
题目内容:
【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
这道题其实和上一题是差不多的。给的区间已经按照左端点排序好了,先查找到待插入的区间应该插入的位置,然后插入再合并重叠的区间即可。如果一个区间d.right < newin.left的话,很显然这个区间d是和newin是不重叠的,在其左边;如果一个区间d.left > newin.right的话,很显然这个区间d在其右边,是不重叠的。除上述两种情况外,那就是有重叠的部分,和一个区间重叠后,合并的区间left = min(newin.left,d.left),只有第一个开始重叠的地方需要更新left,之后right = max(newin.right,d.right)。以下例举了部分情况:
【leetcode 力扣刷题】汇总区间//合并区间//插入区间,力扣刷题,leetcode,区间,分类讨论,c++,算法
实际上还有在最前面、最后面插入的情况,不需要额外讨论,一样按照上述三种情况去判断就好了,最前面和最后面只是插入的位置和重叠位置有些特殊。实现代码如下(C++):文章来源地址https://www.toymoban.com/news/detail-693443.html

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> ans;
        int idx = 0;
        //先把在插入区间左边的区间直接加入答案数组中
        while(idx < intervals.size() && intervals[idx][1] < newInterval[0]){
            ans.emplace_back(intervals[idx]);
            idx++;
        }
        //如果已经在最后了或者是空的,直接插入
        if(idx == intervals.size()) {
            ans.emplace_back(newInterval);
            return  ans;
        }
        //否则idx对应的区间和待插入区间是有重叠的,更新left
        else{
            newInterval[0] = min(intervals[idx][0], newInterval[0]);
        }
        //开始查找重叠部分,直到找到在待插入区间右边的区间
        while(idx < intervals.size() && intervals[idx][0] <= newInterval[1]){   
            //有重叠就更新right         
            newInterval[1] = max(intervals[idx][1], newInterval[1]);   
            idx++;             
        }   
        //插入区间
        ans.emplace_back(newInterval);
        //之后的区间全在待插入区间的右边,直接加入
        while(idx < intervals.size())
            ans.emplace_back(intervals[idx++]);

        return ans;
    }
};

到了这里,关于【leetcode 力扣刷题】汇总区间//合并区间//插入区间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【leetcode 力扣刷题】链表基础知识 基础操作

    在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】是线性结构的,其中线性表包括顺序表和链表。数组就是顺序表,其各个元素在内存中是连续存储的。 链表则是由 数据域 和 指针域 组成的 结构体 构成的,数据域是一个节点的数据,指针域

    2024年02月12日
    浏览(39)
  • 【leetcode 力扣刷题】回文串相关题目(KMP、动态规划)

    题目链接:5. 最长回文子串 题目内容: 题目就是要我们找s中的回文子串,还要是最长的。其实想想,暴力求解也行……就是遍历所有的子串,同时判断是不是回文串,是的话再和记录的最大长度maxlen比较,如果更长就更新。时间复杂度直接变成O(n^3)。 优化的点在于,假设子

    2024年02月09日
    浏览(48)
  • 【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

    题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须 原地修改 输入数组,即不能新建一个数组来完成字符串的反转。我们注意到: 原来下标为0的,反转后是size - 1【原来下标是size - 1的,反转后是0】; 原来下标是1的,反转后是size - 2【原来下标是size -2的,反转后

    2024年02月11日
    浏览(46)
  • 【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

    以下是能用KMP求解的算法题,KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 题目链接:28. 找出字符串中第一个匹配项的下标 题目内容: 题意还是很好理解的,要在字符串haystack中查找一个完整的needle,即字符串匹配。 暴力求解就是用 两层循环 :haystack从第

    2024年02月09日
    浏览(42)
  • 【leetcode 力扣刷题】数学题之除法:哈希表解决商的循环节➕快速乘求解商

    题目链接:166. 分数到小数 题目内容: 题目是要我们把一个分数变成一个小数,并以字符串的形式返回。按道理,直接将分子numerator除以分母denominator就得到了小数,转换成string返回就好。题目要求里指出了特殊情况—— 小数部分如果有循环,就把循环节括在括号里 。 那么

    2024年02月10日
    浏览(40)
  • 【力扣刷题 | 第十七天】

    目录 前言: 55. 跳跃游戏 - 力扣(LeetCode) 45. 跳跃游戏 II - 力扣(LeetCode) 总结:         今天两道类型都是贪心算法,希望可以有所收获 给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断

    2024年02月15日
    浏览(45)
  • 【力扣刷题 | 第七天】

    今天我们将会进入栈与队列的刷题篇章,二者都是经典的数据结构,熟练的掌握栈与队列实现可以巧妙的解决有些问题。 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的

    2024年02月09日
    浏览(48)
  • 力扣刷题19天

             这道题下面是前提:                                           如果没有这个前提,会出现下面情况(前序遍历会变成新的树):         运行代码:           下面代码中出现的问题:         和上面那道题逻辑一样。         运行代码:          

    2024年02月04日
    浏览(45)
  • 力扣刷题 - 数组篇

    https://leetcode.cn/problems/max-consecutive-ones/ 暴力解法: 定义一个变量来统计是否连续 https://leetcode.cn/problems/teemo-attacking/ 暴力解法: 记录每次中的开始时间与结束时间, 然后如果下一次中毒的是在结束时间之前, 就去更新开始时间(让它加上这个持续时间减去结束时间),如果是在之后

    2024年02月16日
    浏览(46)
  • 【力扣刷题 | 第十六题】

    目录 前言: 198. 打家劫舍 - 力扣(LeetCode) 213. 打家劫舍 II - 力扣(LeetCode)  总结: 我们今天继续刷动态规划的题,希望大家可以和我一起坚持下去。 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包