从Leetcode57. 插入区间到C++一些STL用法
从Leetcode57. 插入区间到C++一些STL用法
正解代码
class Solution {
public:
using VecInt = vector<int>;
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
auto pos = lower_bound(intervals.begin(), intervals.end(), newInterval[0], cmp);
int ipos = pos - intervals.begin();
ipos = ipos?ipos-1:ipos;
intervals.insert(pos, newInterval);
int st = intervals[ipos][0], ed = intervals[ipos][1];
for(auto it = intervals.begin() + ipos; it != intervals.end(); it++) {
auto tmp = *it;
if (tmp[0] > ed) {
intervals[ipos++] = VecInt{st, ed};
st = tmp[0];
ed = tmp[1];
}
else
ed = max(ed, tmp[1]);
}
intervals[ipos++] = VecInt{st, ed};
intervals.erase(ipos + intervals.begin(), intervals.end());
return intervals;
}
static bool cmp(const VecInt &ele, int target) {
return ele[0] < target;
}
};
lower_bound自定义比较函数
和sort的自定义比较函数不同,lower_bound得这么写:
static bool cmp(const VecInt &ele, int target) {
return ele[0] < target;
}
- vector的insert
和python当中向list去insert差不多,都是O(n)的复杂度
- 迭代器插入后失效
因为插入后数组中的元素位置发生改变,所以原先的pos迭代器就失效了,如果再尝试使用,就会报错
Line 10: Char 24:
=================================================================
==23==ERROR: AddressSanitizer: heap-use-after-free on address 0x504000000070 at pc 0x55abd599a895 bp 0x7ffe25297a90 sp 0x7ffe25297a88
READ of size 8 at 0x504000000070 thread T0
#0 0x55abd599a894 in size /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_vector.h:993:40
#1 0x55abd599a894 in vector /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/stl_vector.h:602:19
#2 0x55abd599a894 in Solution::insert(std::vector<std::vector<int, std::allocator<int>>, std::allocator<std::vector<int, std::allocator<int>>>>&, std::vector<int, std::allocator<int>>&) solution.cpp:10:24
所以我们要先拿到pos相关的int,然后再得到新的迭代器
- 注意合并的起始位置
因为我们的newInterval,其左端点可能在上一个区间右端点的前面,所以我们要从上一个区间开始往后合并。
- cmp函数需要是static
因为我们在没有创建任何类的实例的情况下要调用这个函数,所以它需要是静态的

浙公网安备 33010602011771号