【leetcode】Insert Interval
来源:互联网 发布:数据库备份服务器 编辑:程序博客网 时间:2024/05/16 06:39
原题:
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]
.
分析:题意比较容易理解,题目中关键一点是所有输入的intervals没有重叠且已排好序。因此在插入时,先后考虑待插入元素的star和endt的位置。
具体地,先将start(待插入元素的start,以下默认,包括end)依次与各个interval比较,如果总是在interval 的右侧,则将interval push进ret;
反之,则比较start与interval.start的相对大小,取较小值作为待插入元素的start,然后再查找end与interval的相对位置,如果end总是在interval的右侧,则i++;反之,若end在interval之间,则取interval.end作为待插入元素的end,若end在interval左侧,则取end作为待插入元素的end,同时i--。
再依次处理剩余的元素。
代码:
class Solution {public: int CheckInterval(int n,Interval intervalT) { if(n < intervalT.start){//left return 1; } if(n>=intervalT.start && n<=intervalT.end){//mid return 2; } if(n > intervalT.end){//right return 3; } return -1; } vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. vector<Interval> ret; if(intervals.size() == 0){ ret.push_back(newInterval); return ret; } bool insertFlag = false; Interval tempInterval; for(vector<Interval>::size_type i=0 ; i!=intervals.size() ; i++){ if(insertFlag == true){ ret.push_back(intervals[i]); } else{ if(CheckInterval(newInterval.start,intervals[i]) == 3){ ret.push_back(intervals[i]); continue; } else if(CheckInterval(newInterval.start,intervals[i]) == 1){ tempInterval.start = newInterval.start; } else { tempInterval.start = intervals[i].start; } while(CheckInterval(newInterval.end,intervals[i])==3 && i!=intervals.size()){ i++; } if(i == intervals.size()){ tempInterval.end = newInterval.end; ret.push_back(tempInterval); insertFlag = true; break; } if(CheckInterval(newInterval.end,intervals[i]) == 1){ tempInterval.end = newInterval.end; ret.push_back(tempInterval); insertFlag = true; i--; } else if(CheckInterval(newInterval.end,intervals[i]) == 2){ tempInterval.end = intervals[i].end; ret.push_back(tempInterval); insertFlag = true; } } } if(insertFlag == false){ ret.push_back(newInterval); } return ret; }};
总结:关键是理清思路。另外要注意intervals为空和newInterval在最后的情况要特别处理。
后续:
觉得自己的代码有点繁琐,在网上参考了下别人的解法,有一个很好的很简洁的代码:
class Solution {public: vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int i = 0; int n = intervals.size(); vector<Interval> ret; while(i<n && newInterval.start>intervals[i].end){ ret.push_back(intervals[i]); i++; } while(i<n && newInterval.end>=intervals[i].start){ newInterval.start = min(newInterval.start,intervals[i].start); newInterval.end = max(newInterval.end,intervals[i].end); i++; } ret.push_back(newInterval); while(i<n){ ret.push_back(intervals[i]); i++; } return ret; }};
其首先是将newInterval左侧的interval插入ret,直到newInterval.start<intervals[i].end,即新interval可以合并,然后查找新interval的end,通过max和min函数可以很巧妙的简化代码。
- 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
- 2013级C++第11周项目——函数的定义与调用
- 战斗录像工具开发记录
- LeetCode 问题难度,面试出现频率及问题相关数据结构和算法
- 云架构师=企业级架构师+SOA架构师+云技术专家
- LinkedList
- 【leetcode】Insert Interval
- Vector
- (使用STL自带的排序功能进行排序7.3.7)POJ 2726 Holiday Hotel(结构体排序)
- 嵌入式移植mjpg-streamer成功
- ios开发-cocos2d-x适配iphone5
- C++中Xerces解析xml文档
- OCP-1Z0-053-V12.02-81题
- 《汇编语言》王爽——一个奇怪的程序之EBF6
- 编写第一个Windows Mobile程序