Leetcode 56. Merge Intervals && 57. Insert Interval(Hard)
2016-10-12 17:11
369 查看
56. Merge Intervals
Problem :Given a collection of intervals, merge all overlapping intervals.
Example:
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
Algorithm:
本题为一个合并区间的题目,即给定一组区间,将多个存在重叠部分的区间合并为一个大区间。本题的具体思路为,首先将所有区间按照左端点从小到大的顺序重新排列。然后,对于相邻两个区间,如果前一个区间的右端点大于后一区间的左端点,则表明两个区间需要进行合并,合并后的新区间的右端点即为两者右端点中的最大值。继续向后进行上述比较,直到前一个区间的右端点小于后一区间的左端点,则表明前一区间已经不会继续向后合并,前一区间加入新区间集合中。
重复上述过程,扫描完所有区间,即可得到答案。其中,排序所需时间为O(nlogn),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(nlogn)。
Code:
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool cmd(Interval n1, Interval n2){ return n1.start < n2.start; } class Solution { public: vector<Interval> merge(vector<Interval>& intervals) { if(intervals.size() == 0) return vector<Interval>(); sort(intervals.begin(), intervals.end(), cmd); vector<Interval> ans; int tb = intervals[0].start; int te = intervals[0].end; for(int i = 1; i < intervals.size(); ++i) { if(intervals[i].start > te){ ans.push_back(Interval(tb, te)); tb = intervals[i].start; te = intervals[i].end; } else if(intervals[i].end > te) te = intervals[i].end; } ans.push_back(Interval(tb, te)); return ans; } };
57. Insert Interval
Problem :Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example:
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
Algorithm:
本题和56题为两道母子题。本题的做法为,先将所给区间插入所给区间序列合适的位置中,然后与56题采用相同的做法即可。
其中,插入区间所需时间为O(n),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(n)。
Code:
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool cmd(Interval n1, Interval n2){ return n1.start < n2.start; } class Solution { public: vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { bool judge = false; for(int i = 0; i < intervals.size(); ++i) { if(intervals[i].start > newInterval.start) { intervals.insert(intervals.begin() + i, newInterval); judge = true; break; } } if(!judge) intervals.push_back(newInterval); vector<Interval> ans; int tb = intervals[0].start; int te = intervals[0].end; for(int i = 1; i < intervals.size(); ++i) { if(intervals[i].start > te){ ans.push_back(Interval(tb, te)); tb = intervals[i].start; te = intervals[i].end; } else if(intervals[i].end > te) te = intervals[i].end; } ans.push_back(Interval(tb, te)); return ans; } };
相关文章推荐
- Leetcode 56. Merge Intervals & 57. Insert Interval
- 56. Merge Intervals && 57. Insert Interval
- 【LeetCode】Merge Intervals && Insert Interval
- [LeetCode]Merge Intervals && Insert Interval
- leetcode题解-55. Jump Game && 56. Merge Intervals
- 【LeetCode】Merge Intervals && Insert Interval
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
- leetcode56&57_Merge Intervals&Insert Interval
- leetcode hard模式专杀之57. Insert Interval
- 【leetcode】Jump Game I & II (hard)
- LeetCode 56. Merge Intervals
- 56. Merge Intervals 57. Insert Interval *HARD*
- [LeetCode] 57. Insert Interval 解决思路
- LeetCode 57. Insert Interval/56. Merge Intervals
- 【leetcode】Insert Interval(hard)★
- LeetCode 57. Insert Interval
- [leetcode] 57. Insert Interval 解题报告
- LeetCode 56. Merge Intervals
- leetcode 56. Merge Intervals
- LeetCode: Insert Interval & Merge Interval