码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 57. 插入区间

时间:2020-01-26 16:10:31      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:初始   存储空间   处理   lag   插入   vector   ack   class   行合并   

题目链接: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. 插入区间

标签:初始   存储空间   处理   lag   插入   vector   ack   class   行合并   

原文地址:https://www.cnblogs.com/yy-1046741080/p/12234270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!