题目链接: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,都能够返回迭代器。
原文地址:https://www.cnblogs.com/yy-1046741080/p/12234270.html
时间: 2024-10-11 16:11:16