区间合并leetcode56

博客围绕区间合并问题展开,介绍了常见的贪心思想思路,即按start值排序后比较区间;还提到难想的思路,按start和end分别排序后合并。同时分享了代码编写中遇到的问题,如定义vector赋值为空,指出若声明大小应直接访问而非用push_back。

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

Given a collection of intervals, merge all overlapping intervals.
Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

比较常见的思路(贪心思想):

  • 将区间按照start值排序,得到的interval的start值是从小到大的。
  • 先将interval的第一个区间放进结果中,然后遍历interval中的区间。
  • 将interval中的start值和res中最后的区间的end值进行比较,若前者比后者大,则两个区间没有交集,则将该区间加入到res中;反之,则两个区间有交集,则当前res区间的end值要变更为两者end值的最大值。
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {

public:
    static bool cmp(const Interval &a,const Interval &b){
        return a.start<b.start;
    }
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        int n=intervals.size();
        if(n<2) return intervals;
      
        sort(intervals.begin(),intervals.end(),cmp);
        res.push_back(intervals[0]);
        for(int i=1,j=0;i<n;++i){
            if(res[j].end<intervals[i].start){
                res.push_back(intervals[i]);
                j++;
            }
            else{
                res[j].end=max(res[j].end,intervals[i].end);
            }
        }   
        return res;
    }
};
  • 关于res的处理,我用了一个变量j来控制,但参考了其他的,发现可以直接用res.back(),因为只是把res最后的那个和interval中的区间进行比较。
sort(intervals.begin().start,intervals.end().start);//这样是不行的

P.S 一定要有开头的特殊情况判断,不然又会报错。

难想的思路
将区间分别按start,end排序,若前一个区间的end大于后一个区间的start就合并。
(其实这一个我不太理解,为什么start和end分别排序了之后,这样的比较还能关联到原区间?望大佬告知)

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        int n=intervals.size();
        vector<int> starts;
        vector<int> ends;
        for(int i =0;i<n;i++) starts.push_back(intervals[i].start);
        for(int i =0;i<n;i++) ends.push_back(intervals[i].end);

        sort(starts.begin(),starts.end());
        sort(ends.begin(),ends.end());
        for(int i=0,j=0;i<n;i++){
            if(i==n-1 || starts[i+1]>ends[i]){
                Interval tmp(starts[j],ends[i]);
                res.push_back(tmp);
                j=i+1;
            }
        }
        return res;   
    }
};

写这个代码的时候遇到一个奇怪的问题,定义starts、ends的时候,加入个数作为参数,但这样后面给starts,ends赋值的for循环执行之后,两个vector中的元素都为空。

vector<int> starts(n);
vector<int> ends(n);

我以为是因为不能用不明确的标量,于是写了一个程序在本地测试发现,即使用明确的数字定义,赋值之后都是0。
查询了一下发现,原来是因为,push_back是在最后面添加.That’s really embarrassing .
在这里插入图片描述
如果实现申明了vector大小,就直接访问其中某一个位置,而不是用push_back。
在这里插入图片描述
(我真是一只辣鸡)
(另外我还想吐槽一下这个编辑博客插图片的时候,常常出现点击了上传图片之后就没有之后的情况啊!!!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值