力扣 题目56--合并区间

题目


题解

思路来自评论区大佬LWQ

将starti与endi 分开 以intervals = [[1,3],[2,6],[8,10],[15,18]]为例 分开之后(注意要排序)

starts=[1,2,8,15]

ends=[3,6,10,18]

那么我们如下图所示遍历 endsends的对角starts位置比较 2<3 说明下一个重叠 按兵不动 继续遍历

如下图 6<8了也就是说下一个不重叠了 那么我们将 [1,6]保存 此时starts的位置应该从1变成8 而ends遍历也应该从 8下面的10开始

我们发现对角10<15那么 我们将[8,10] 保存还剩下最后[10,15]保存了

代码

在原代码中使用了两个vector 在这里本人删掉了一个 用一个遍历 如果看不懂可以去原作者下面看 感谢支持!

 1 class Solution {
 2 public:
 3     vector<vector<int>> merge(vector<vector<int>>& intervals) {
 4         int n = intervals.size();
 5         vector<vector<int>> res;
 6         vector<int> nums;
 7         for (int i = 0; i < n; ++i) {
 8             nums.push_back(intervals[i][0]);
 9         }
10         for (int i = 0; i < n; ++i) {
11             nums.push_back(intervals[i][1]);
12         }
13         sort(nums.begin(), nums.begin() + n);
14         sort(nums.begin() + n, nums.end());
15         for (int i = 0, j = 0; i < n; ++i) {
16             if (i == n - 1 || nums[i + 1] > nums[n + i]) {
17                 res.push_back({ nums[j], nums[n + i] });
18                 j = i + 1;
19             }
20         }
21         return res;
22     }
23 };
View Code

 

posted @ 2022-05-19 13:01  无聊的阿库娅  阅读(22)  评论(0编辑  收藏  举报