Merge Intervals & Insert Interval

56. Merge Intervals

题目链接:https://leetcode.com/problems/merge-intervals/#/description

题目大意:给定区间的集合,合并所有有重叠的区间,然后返回合并区间后的集合

 

思路:A和B两个区间合并的条件A.start <= B.start <= A.end or B.start <= A.start <= B.end,如果先对集合进行排序,则合并条件左半部分可以满足,遍历时判断合并条件的右半部分即可。

算法步骤:(1)对区间集合进行排序,排序的键为区间的start;(2)遍历集合,判断当前区间与下一区间能否合并,如果可以合并,将当前区间更新为当前区间和下一区间的合并,否则更新当前区间为下一区间

 

算法复杂度:时间复杂度O(nlog(n)),空间复杂度O(n)

代码:

 1 /**
 2  * Definition for an interval.
 3  * struct Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() : start(0), end(0) {}
 7  *     Interval(int s, int e) : start(s), end(e) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<Interval> merge(vector<Interval>& intervals) {
13         sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){return a.start < b.start;});
14         vector<Interval> res;
15         if (intervals.size() > 0) {
16             res.push_back(intervals[0]);
17             for (auto &interval : intervals) {
18                 if (res.back().end < interval.start)
19                     res.push_back(interval);
20                 else
21                     res.back().end = max(res.back().end, interval.end);
22             }
23         }
24         return res;
25     }
26 };

评测系统上运行结果:

 

57. Insert Interval

题目链接:https://leetcode.com/problems/insert-interval/#/description

题目大意:给定一个互相没重叠的排好序的区间集合,现在要插入一个区间,区间插入后如果区间之间有重叠,需要对重叠的区间进行合并。

 

思路:遍历集合,如果当前区间和待插入的区间的重叠,更新待插入的区间为当前区间和待插入区间的合并

算法步骤:(1)找出所有在待插入区间左侧的区间(不重叠)(2)合并所有和待插入区间有重叠的区间(3)找出所有在待插入区间右侧的区间(不重叠)

算法复杂度:时间复杂度O(n),空间复杂度O(n)

代码:

 1 /**
 2  * Definition for an interval.
 3  * struct Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() : start(0), end(0) {}
 7  *     Interval(int s, int e) : start(s), end(e) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
13         auto begin = intervals.cbegin();
14         vector<Interval> res;
15         while (begin != intervals.cend() && begin->end < newInterval.start)
16             res.push_back(*begin++);
17         while (begin != intervals.cend() && begin->start <= newInterval.end) {
18             newInterval.start = min(begin->start, newInterval.start);
19             newInterval.end = max(begin->end, newInterval.end);
20             ++begin;
21         }
22         res.push_back(newInterval);
23         while (begin != intervals.cend())
24             res.push_back(*begin++);
25         return res;
26     }
27 };

评测系统上运行结果:

 

posted @ 2017-03-18 16:52  小谷子的博客园  阅读(187)  评论(0编辑  收藏  举报