LeetCode 57. 插入区间

Posted yy-1046741080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 57. 插入区间相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/insert-interval/


解法一:可以LeetCode 56 题的合并区间为基础。   将newInterval插入至intervals中,然后对intervals进行合并区间,就能够得到最终的结果。   时间复杂度:O(N)

 


解法二:贪心算法。 

 

配合代码讲解:

  • 使用start_ptr和end_ptr记录需要被合并的块区间。
  • 用start_pos和end_pos记录合并的区间的端点值。
  • 使用start_flag来记录是否找到左端点。
  • 使用tmp_ptr遍历intervals,我们将intervals分解成为多个tmp和tmp之前的区域,分别对区间之前的区域和区间进行讨论,还需要对左端点和右端点进行讨论:因此对应4个if,最后得到start_pos,end_pos。
intervals = [[1,3],[6,9]], newInterval = [2,5]
[﹣∞ , 1) , [1 , 3]        (3,6),[6,9]       (9,∞)
  • 初始值很重要!可能存在这种情况,newInterval最后插入在intervals的最后边,不需要进行合并。   在这种情况下,处理过程不会对start_pos,end_pos,start_ptr,end_ptr进行任何的修改,因此,初始值将他们最后需要的值。

 

 1 vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
 2         if(intervals.empty()){
 3             intervals.push_back(newInterval);
 4             return intervals;
 5         }
 6         auto start_ptr=intervals.end(); //intervals中需要删除的起始块
 7         auto end_ptr=intervals.end(); // [start_ptr,end_ptr);
 8         auto tmp_ptr=intervals.begin();  // 遍历指针
 9         int start_pos=newInterval[0];  // 新插入区间的左端点
10         int end_pos=newInterval[1];  // 右端点
11         bool start_flag=false;  // 左端点判断 ,true:表示左端点已确定
12         
13         while(tmp_ptr!=intervals.end()){
14             // 左端点,区间之外,取newInterval[0];
15             if(newInterval[0]<(*tmp_ptr)[0]){
16                 if(!start_flag){
17                     start_pos=newInterval[0];
18                     start_ptr=tmp_ptr;
19                     start_flag=true;
20                 }
21             }
22             // 左端点,区间之内 
23             if(newInterval[0]>=(*tmp_ptr)[0] && newInterval[0]<=(*tmp_ptr)[1]){
24                 if(!start_flag){
25                     start_pos=(*tmp_ptr)[0];
26                     start_ptr=tmp_ptr;
27                     start_flag=true;
28                 }
29             }
30             if(newInterval[1]<(*tmp_ptr)[0]){
31                 end_pos=newInterval[1];
32                 end_ptr=tmp_ptr;
33                 break;
34             }
35             if(newInterval[1]<(*tmp_ptr)[1] && newInterval[1]<=(*tmp_ptr)[1]){
36                 end_pos=(*tmp_ptr)[1];
37                 end_ptr=++tmp_ptr;
38                 break;
39             }
40             tmp_ptr++;
41         }
42         start_ptr=intervals.erase(start_ptr,end_ptr);
43         intervals.insert(start_ptr,vector<int>{start_pos,end_pos});
44         return intervals;
45     }

关于容器操作可能使vector迭代器失效:

  • 对于插入元素,如果存储空间重新分配,那么指向容器的迭代器,指针,引用全部失效。如果没有分配,那么插入位置之后的迭代器,指针,引用全部失效。
  • 如果是删除,那么被删元素之前的迭代器,指针,引用全部有效。

对于insert和erase,都能够返回迭代器。

 

以上是关于LeetCode 57. 插入区间的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----57. 插入区间

python-leetcode57-区间合并插入区间

LeetCode 57. 插入区间

leetcode 57. 插入区间

LeetCode 57 插入区间

LeetCode(57):插入区间