中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2021-2-28
- 最后登录
- 1970-1-1
|
follow up, 一个list比另一个短特别多的情况: O(MlogN),M是短list的长度,N是长list的长度
- class Solution {
- public:
- vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
- int n_first = firstList.size();
- int n_second = secondList.size();
-
- if (n_first < n_second) {
- for (auto &interval : firstList)
- binary_search(interval, secondList);
- } else {
- for (auto &interval : secondList)
- binary_search(interval, firstList);
- }
-
- return result;
- }
-
- private:
- vector<vector<int>> result;
- void binary_search(vector<int> &interval, vector<vector<int>> &longList) {
- auto comp = [](const vector<int> &interval1, const vector<int> &interval2) {
- return interval1[1] < interval2[1];
- };
-
- vector<int> itv = {interval[0], interval[0]};
- auto it_left = lower_bound(longList.begin(), longList.end(), itv, comp);
- if (it_left == longList.end())
- return;
-
- itv = {interval[1], interval[1]};
- auto it_right = lower_bound(longList.begin(), longList.end(), itv, comp);
- if (it_right != longList.end())
- it_right++;
-
- for (; it_left < it_right; it_left++) {
- vector<int> overlap = {max(interval[0], (*it_left)[0]),
- min(interval[1], (*it_left)[1])};
-
- if (overlap[0] <= overlap[1])
- result.push_back(overlap);
- }
- }
- };
复制代码 |
|