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 };
评测系统上运行结果: