数组问题56:合并区间
一、题目要求
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
-
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. -
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。 -
提示:
- 1 <= intervals.length <= 104
- intervals[i].length == 2
- 0 <= starti <= endi <= 104
重 要 信 息 点 \color{red}{重要信息点} 重要信息点:
1、单个区间为 intervals[i] = [starti, endi];
2、合并所有重叠的区间,并返回一个不重叠的区间数组–> 包含所有的已经输入的所有区间。
二、基本思路
1、木有思路啊!看不懂官当的答案!
2、队列的思想
排序之后,判断每一个区间的左值与上一区间的最大值的关系!
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(!intervals.size()) return {};
sort(intervals.begin(), intervals.end()); // 首先对非空矩阵进行排序
vector<vector<int>> q; // 定义一个二维容器q,类型为整型
q.push_back(intervals[0]); // 压入intervals中排序之后的第一个位置处的元素
for(int i=1; i<intervals.size(); i++){
vector<int>& lastvals = q.back(); //定义动态数组中的待输出端的数值为 lastvals 位置对应的数值
int currentLeft = intervals[i][0]; // 定义intervals中第i个小区间的左边数值
int currentRight = intervals[i][1]; // 定义intervals中第i个小区间的右边数值
if(lastvals[1] < currentLeft) //判断当前小区间的最左边数值与上一个区间位置处的数值大小
{
q.push_back(intervals[i]); // 若上一区间最后位置处的数值小于当前区间的最小值,将该数值压入到队列中
}
else {
lastvals[1] = max(lastvals[1], currentRight);// 若上一区间最后位置处的数值大于或者等于当前区间的最小值,对比lastvals的数值与该区间最右端数值,将最大值赋值给lastvals.
}
}
return q;
}
};
三、补充内容
1、向数据结构中添加元素
2、vector 函数
vector 常见方法介绍
(1)vector< 类型 > 标识符 ;
(2)vector< 类型 > 标识符(最大容量) ;
(3)vector< 类型 > 标识符(最大容量,初始所有值);
(4) int i[4] = {12,3,4,5};
vector< 类型 > vi(i , i+2); //得到i索引值为3以后的值 ;
(5)vector< vector<int> > //vi 定义2维的容器;记得一定要有空格,不然可能会报错
vector< int > line // 在使用的时候一定要首先将vi个行进行初始化;
for(int i = 0 ; i < 10 ; i ++)
{
vector.push_back(line);
}
vector 定义二维数组,长度可以不预先确定。
(6)C++ vector排序
vector< int > vi ;
vi.push_back(1);
vi.push_back(3);
vi.push_back(0);
sort(vi.begin() , vi.end()); /// /从小到大
reverse(vi.begin(),vi.end()); /// 从大到小
(7)顺序访问
vector < int > vi ;
for( int i = 0 ; i < 10 ; i ++)
{
vi.push_back(i);
}
for(int i = 0 ; i < 10 ; i ++) /// 第一种调用方法
{
cout <<vi[i] <<" " ;
}
for(vector<int>::iterator it = vi.begin() ;it !=vi.end() ; it++) ///第二种调用方法
{
cout << *it << " " ;
}
(8)查找
vector < int > vi ;
for( int i = 0 ; i < 10 ; i ++)
{
vector.push_back(i);
}
vector < int >::interator it = find(vi.begin() , vi.end(),3) ;
cout << *it << endl ; ///返回容器内找到值的位置。
(9)使用数组对C++ vector进行初始化
int i[10] ={1,2,3,4,5,6,7,78,8} ;
///第一种
vector<int> vi(i+1,i+3); ///从第2个元素到第3个元素
for(vector <int>::interator it = vi.begin() ; it != vi.end() ; it++)
{
cout << *it <<" " ;
}
(10) 结构体的 vector
struct temp
{
public :
string str ;
public :
int id ;
}tmp;
int main()
{
vector <temp> t ;
temp w1 ;
w1.str = "Hello world" ;
w1.id = 1 ;
t.push_back(t1);
cout << w1.str << "," <<w1.id <<endl ;
return 0 ;
}
3、队列的思想
// queue 队列, first In , first out!!
vector<vector<int>>& intervals; // 定义一个二维容器
vector<vector int> q; // 定义一个二维数组的容器,类型为整型
q.push(intervals[0]); //入队; 将x 接到队列的末端。
q.pop(); //出队,弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
q.push_back(intervals[0]); // 在容器q中压入第一个元素;
q.front(); // 访问队首元素,即最早被压入队列的元素
q.back(); // 访问队尾元素,即最后被压入队列的元素
q.empty(); //判断队列空,当队列空时,返回true。
q.size(); //访问队列中的元素个数