leetcode刷题12——区间系列

本文介绍了如何通过排序和模拟实现合并重叠区间、插入新的不重叠区间以及汇总覆盖数组的区间列表。通过实例展示了Solution类中的三个关键函数,分别针对合并、插入操作和生成最小覆盖范围的字符串表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> v;
        v.push_back(intervals[0]);
        for(int i=1;i<intervals.size();++i)
        {
            int left=intervals[i][0],right=intervals[i][1];
            if(left>v.back()[1])
                v.push_back(intervals[i]);
            else
                v.back()[1]=max(right,v.back()[1]);
        }
        return v;
    }
};

2.插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
考察知识点:模拟

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> v;
        int left=newInterval[0],right=newInterval[1];
        bool placed=false;
        for(int i=0;i<intervals.size();++i)
        {
            if(intervals[i][1]<left)
                v.push_back(intervals[i]);
            else if(intervals[i][0]>right)
            {
                if(!placed)
                {
                    v.push_back({left,right});
                    placed=true;
                }
                v.push_back(intervals[i]);
            } 
            else
            {
                left=min(intervals[i][0],left);
                right=max(intervals[i][1],right);                        
            }
        }
        if(!placed)
            v.push_back({left,right});
        return v;
    }
};

3.汇总区间
给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
“a->b” ,如果 a != b
“a” ,如果 a == b

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int n=nums.size();
        if(n==0)  return {};
        vector<string> v;
        string s;
        int left=0,right=0;
        for(int i=1;i<n;++i)
        {
            if(long(nums[i])-long(nums[i-1])>1)
            {
                right=i-1;
                if(left==right)
                    s=to_string(nums[left]);
                else
                    s=to_string(nums[left])+"->"+to_string(nums[right]);
                v.push_back(s);
                left=i;
            }
        }
        if(left==n-1)
             s=to_string(nums[left]);
        else
             s=to_string(nums[left])+"->"+to_string(nums[n-1]);
         v.push_back(s);
        return v;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值