首页 > 其他 > 详细

leetcode 56. Merge Intervals

时间:2019-10-08 21:18:01      阅读:87      评论:0      收藏:0      [点我收藏+]

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

 

题目大意:合并区间,[1,3]和[2,6]有交集,合并[1,6]。

 

思路一:先将数组排序,优先根据区间的第一个数排序,小的排在前面,如果区间第一个数相同,根据区间第二个数从小到大排序。

假设下标 i 指向排好序的第i个区间,从第 i + 1个区间[c, d]开始合并与第i个区间[a, b]有交集的区间。由于排好序,如果第i + 1个区间与第i个数没有交集,后面的区间必然没有交集。

假如第i + 1个区间[c, d]的第一个数c在第i个区间[a, b]内,则合并。如果d >= b, 说明合并后的区间要更新,否则(d < b)说明[c, d]在[a, b]内部。

 1 class Solution {
 2     static bool cmp(vector<int> a, vector<int> b) {
 3         if (a[0] != b[0])
 4             return a[0] < b[0];
 5         else 
 6             return a[1] < b[1];
 7     }
 8 public:
 9     vector<vector<int>> merge(vector<vector<int>>& intervals) {
10         vector<vector<int> > res;
11         sort(intervals.begin(), intervals.end(), cmp);
12         for (int i = 0; i < intervals.size();) {
13             vector<int> tmp(2, 0); //用于保存每一轮合并的区间
14             tmp[0] = intervals[i][0], tmp[1] = intervals[i][1]; //一开始初始化合并区间为当前的区间
15             while (++i < intervals.size() && (intervals[i][0] <= tmp[1])) { //从当前区间后一个区间开始判断
16                 if (intervals[i][1] >= tmp[1])
17                     tmp[1] = intervals[i][1];
18             }
19             res.push_back(tmp);
20         }
21         return res;
22     }
23 };

时间复杂度: O(NlogN), 空间复杂度 O(1)

思路二:

leetcode 56. Merge Intervals

原文:https://www.cnblogs.com/qinduanyinghua/p/11637443.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!