LeetCode——数组问题56:合并区间

12 篇文章 1 订阅

数组问题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();  //访问队列中的元素个数

队列与栈的思想

四、他山之石

1、官方解答

2、排序法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shae Zhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值