题目:以数组 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;
}
- 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.思路梳理
-
对题目给的向量先排序好,然后重点就在于比较‘后一个向量的first’与‘前一个向量的second’,如果后一个向量的first小于或者等于前一个向量的second,那么这两个向量就会重叠,那么就要进行合并处理。
-
合并处理:我认为比较好的思路是适用back()这个方法,合并后的数据存放的地方,我们只看它的最后一个向量,也就是latest存进去的向量,不要对merge_arr这个数组去考虑要存放到第几个这种事,通通存到最后一个向量去,这样就可以让merge_arr这个容器自然增长。
然后对于merge_arr这最后一个向量的second,要比较当前最后一个向量second与intervals[i][1]的大小,选择大的存进去。 -
在这道题思路上有一个地方我觉得可以提一下:打个比方来解释,一群人面前有一堆座位abc…,要按照人的高矮顺序入座,那么此时有两种办法:
(第一种):人群先按照身高排好队再入座
(第二种):人群不需要先排队,最前面的直接坐到a位置上,第二个人与坐在a位置上的人进行比较身高,如果比a高,那么第二个人做在a位置上,第一个人移到b座位上
那么对应到这道题来说,这个人群就要加上限定,也就是还有些人还没到,要过十分钟半个小时甚至很久才到,那么这个时候用(第一种)方法就不太好,用人话来说就是当你往merge_arr中添加向量(L,R)时,没必要一开始就要确定好这个向量的R值最终是多少,可以用(第二种)的思想,直接把(L,R)值存入,这个R值目前不对不要紧,之后会慢慢修正的。