Leetcode_合并区间

文章讨论了如何在C++中正确合并给定区间数组,指出原解决方案的错误在于对vector元素的初始化和访问,以及提供了一个正确解法,包括对区间进行排序并动态合并重叠部分。

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

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

1. 记录错误解法:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size()==0)
        {
            return {};
        }
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> merge_arr;
        int back=0;
        merge_arr[back][0]=intervals[0][0];  //error
        merge_arr[back][1]=intervals[0][1];   //error
        for(int i=1;i<intervals.size();i++)
        {
            if(intervals[i][0]<=merge_arr[back][1]) //出现重叠
            {
                merge_arr[back][1]=max(merge_arr[back] [1],intervals[i][1]);
            }
            else
            {
                back++;
                merge_arr[back][0]=intervals[i][0];  //error
                merge_arr[back][1]=intervals[i][1];   //error
            }
        }
        return merge_arr;
    }
};

2. 错误原因:

1.对c++语法有点忘记了,在c++中创建了一个vector<vector< int >> arr类型的变量时,一开始不能直接使用arr[0],arr[0][0]诸如此类的进行具体某个元素的赋值,因为此时arr中还是空的,需要使用push_back()成员函数,来对arr添加新元素。以下是一个简单的例子来往vector向量添加元素

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec; // 定义一个空的vector

    vec.push_back(10); // 向vector中添加一个元素10
    vec.push_back(20); // 再添加一个元素20
    // 使用循环来打印vector中的所有元素
    for(int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}
  1. c++还有一个需要注意的地方,以提问的形式来呈现吧
  • 在c++中,vector<vector< int >> arr; 那么arr.size()的大小是哪个维度的?
    在 C++ 中,如果你有一个二维向量,比如 vector<vector> arr;,arr.size() 返回的是这个二维向量的第一维的大小。换句话说,它返回的是包含的子向量的数量,而不是整个数组的维数。

    例如,如果你的 arr 被初始化为:vector<vector<int>> arr = { {1, 2}, {3, 4}, {5, 6} };
    那么 arr.size() 将返回 3,因为 arr 包含三个 vector 类型的元素(即三行)。

    如果你想获取第二维的大小(即每个子向量的长度),你需要针对特定的子向量调用 size()。例如,arr[0].size() 将返回第一个子向量的大小。需要注意的是,二维向量的子向量长度可以不同。

3. 正确解法

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

            }
        }
        return merge_arr;
    }
};

4.思路梳理

  1. 对题目给的向量先排序好,然后重点就在于比较‘后一个向量的first’与‘前一个向量的second’,如果后一个向量的first小于或者等于前一个向量的second,那么这两个向量就会重叠,那么就要进行合并处理

  2. 合并处理:我认为比较好的思路是适用back()这个方法,合并后的数据存放的地方,我们只看它的最后一个向量,也就是latest存进去的向量,不要对merge_arr这个数组去考虑要存放到第几个这种事,通通存到最后一个向量去,这样就可以让merge_arr这个容器自然增长。
    然后对于merge_arr这最后一个向量的second,要比较当前最后一个向量second与intervals[i][1]的大小,选择大的存进去。

  3. 在这道题思路上有一个地方我觉得可以提一下:打个比方来解释,一群人面前有一堆座位abc…,要按照人的高矮顺序入座,那么此时有两种办法:
    (第一种):人群先按照身高排好队再入座
    (第二种):人群不需要先排队,最前面的直接坐到a位置上,第二个人与坐在a位置上的人进行比较身高,如果比a高,那么第二个人做在a位置上,第一个人移到b座位上
    那么对应到这道题来说,这个人群就要加上限定,也就是还有些人还没到,要过十分钟半个小时甚至很久才到,那么这个时候用(第一种)方法就不太好,用人话来说就是当你往merge_arr中添加向量(L,R)时,没必要一开始就要确定好这个向量的R值最终是多少,可以用(第二种)的思想,直接把(L,R)值存入,这个R值目前不对不要紧,之后会慢慢修正的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值