[leetcode]Insert Interval
来源:互联网 发布:淘宝电商怎么加盟代理 编辑:程序博客网 时间:2024/06/16 04:56
57. Insert Interval
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 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].
思路:找出与插入的区间不重合的(分为左右两部分),然后再处理重合的与插入的区间。
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval){ vector<Interval> left, right; for (auto it : intervals) { if (it.end < newInterval.start) left.push_back(it); if (it.start > newInterval.end) right.push_back(it); } if (left.size() + right.size() != intervals.size()) { newInterval.start = min(newInterval.start, intervals[left.size()].start); newInterval.end = max(newInterval.end, intervals[intervals.size() - right.size() - 1].end); } left.push_back(newInterval); left.insert(left.end(), right.begin(), right.end()); return left;}
其中找不重合的区间可以使用二分法。利用upper_bound.
class Solution{private: int upper_bound(const vector<Interval> &intervals, int target) { int count = intervals.size(), first = 0; while (count > 0) { int pos = first + count / 2; if (target >= intervals[pos].start) first = ++pos, count -= (count / 2 + 1); else count /= 2; } return first; }public: vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { int N = intervals.size(); vector<Interval> res; int left = upper_bound(intervals, newInterval.start); int right = upper_bound(intervals, newInterval.end); if (left > 0 && intervals[left - 1].end >= newInterval.start && intervals[left - 1].start < newInterval.start) newInterval.start = intervals[left - 1].start; if (right > 0 && intervals[right - 1].start <= newInterval.end && intervals[right - 1].end > newInterval.end) newInterval.end = intervals[right - 1].end; for (int i = 0; i < left - 1; res.push_back(intervals[i++])); if (left > 0 && intervals[left - 1].end < newInterval.start) res.push_back(intervals[left - 1]); res.push_back(newInterval); for (int i = right; i < N; res.push_back(intervals[i++])); return res; }};
阅读全文
0 0
- LeetCode: Insert Interval & Merge Interval
- LeetCode题目 Insert Interval
- LeetCode: Insert Interval
- LeetCode Insert Interval
- LeetCode: Insert Interval
- Leetcode: Insert Interval
- [LeetCode] Insert Interval
- LeetCode Insert Interval
- [LeetCode]Insert Interval
- leetcode insert interval
- [leetcode]Insert Interval
- LeetCode-Insert Interval
- [leetcode] Insert Interval
- LeetCode - Insert Interval
- 【leetcode】Insert Interval
- leetcode Insert Interval
- 【leetcode】Insert Interval
- LeetCode Insert Interval
- mysql服务安装失败
- Div在设置了浮动的情况下水平居中
- Oracle 11g 导出空表
- 欢迎使用CSDN-markdown编辑器
- 《算法导论》第19章 斐波那契堆 个人笔记
- [leetcode]Insert Interval
- 别再说“差一点点就…",那只证明了你永远不会成功
- 卷积神经网络-初学者指南 (Part 1)
- Spring MVC注解标签
- 数据结构学习实录二—算法的评价
- Spring IOC之bean的scope属性值:prototype与singleton
- 误删oracle redo01-03.log文件解决方法
- 45中JavaScript大全
- Laravel 5.4 migrate时报错: Specified key was too long error