LeetCode #57 | Insert Interval
来源:互联网 发布:瞩目视频会议软件下载 编辑:程序博客网 时间:2024/05/18 14:28
首先是题目:
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]
.
思路比较简单。首先,试图在一个向量中移动元素是一个很蠢的想法,我们肯定用空间换时间,直接新构造一个向量往里填入最终结果。
然后,考虑做法。把区间看做两个数,且数递增排序,那么n个区间会得到一个2n大小的数组。找出要插入区间的两个的端点的位置,把在这两个位置中间的点全部去掉即可。当然,我们在构造这个数组的时候就可以将在要插入区间里的数“扔掉”。于是,最坏的情况需要O(4n)的时间复杂度,即遍历两遍区间的两端(此时插入区间和原区间没有任何合并)。
下面上代码
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */class Solution {public: vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) { int size = intervals.size(); vector<Interval> res; // result vector<int> list; bool flag = false, flag2 = false; int i = 0; if(intervals.empty()) { res.push_back(newInterval); return res; } while(i < size) { if(!flag) { if(newInterval.start < intervals[i].start) { list.push_back(newInterval.start); flag = true; continue; } else if(newInterval.start <= intervals[i].end) { list.push_back(intervals[i].start); flag = true; continue; } else if(i == size-1) { list.push_back(intervals[i].start); list.push_back(intervals[i].end); list.push_back(newInterval.start); list.push_back(newInterval.end); break; } list.push_back(intervals[i].start); list.push_back(intervals[i].end); ++i; } else if(!flag2 && flag) { if(newInterval.end < intervals[i].start) { list.push_back(newInterval.end); flag2 = true; continue; } else if(newInterval.end <= intervals[i].end) { list.push_back(intervals[i].end); flag2 = true; ++i; continue; } else if(i == size-1) { list.push_back(newInterval.end); break; } ++i; } else if(flag && flag2) { list.push_back(intervals[i].start); list.push_back(intervals[i].end); ++i; } } size = list.size(); Interval tmp; for(int index=0;index<size;index+=2) { tmp.start = list[index]; tmp.end = list[index+1]; res.push_back(tmp); } return res; }};
0 0
- leetcode || 57、Insert Interval
- Leetcode#57||Insert Interval
- leetcode 57: Insert Interval
- leetcode 57:Insert Interval
- LeetCode 57 - Insert Interval
- Leetcode 57 Insert Interval
- LeetCode #57: Insert Interval
- Leetcode 57 Insert Interval
- Leetcode 57 Insert Interval
- LeetCode 57 Insert Interval
- LeetCode 57 --- Insert Interval
- leetcode-57 insert interval
- LeetCode #57 | Insert Interval
- LeetCode 57 Insert Interval
- [Leetcode 57, Hard] Insert Interval
- [leetcode-57]Insert Interval(java)
- LeetCode(57) Insert Interval
- LeetCode-57-Insert Interval 水
- Java静态类
- Android SD卡状态监听
- U-Box of Bricks
- Can you answer these queries (HDU 4027)
- Android智能心跳微信
- LeetCode #57 | Insert Interval
- NYOJ-305-表达式求值(第四届河南省程序设计大赛C题(模拟+栈||递归)(sscanf函数的应用))
- ios控制器之间传值-单例传值
- Oracle insert大数据量经验之谈
- Docker的使用--制作自己的镜像(四)
- Ubuntu下指令-查看端口的占用情况以及抓包
- 使用MVP+Retrofit+RxJava实现的的Android Demo (下)使用Retrofit+RxJava处理网络请求
- Laravel5.2版本后更新的中间件组部分
- Java实现动态代理的两种方式