题目:

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]. (Hard)

分析:

首先可以采用merge interval的方法,先把区间填进去,然后排序,最后再调用merge,复杂度O(NlogN)

代码:

  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. private:
  12. static bool cmp (const Interval& I1, const Interval& I2) {
  13. return I1.start < I2.start;
  14. }
  15. vector<Interval> merge(vector<Interval>& intervals) {
  16. vector<Interval> result;
  17. if (intervals.size() == ) {
  18. return result;
  19. }
  20. sort(intervals.begin(), intervals.end(), cmp);
  21. int left = intervals[].start, right = intervals[].end;
  22. for (int i = ; i < intervals.size(); ++i) {
  23. if (intervals[i].start <= right) {
  24. right = max(right,intervals[i].end);
  25. }
  26. else {
  27. result.push_back(Interval(left,right));
  28. left = intervals[i].start;
  29. right = intervals[i].end;
  30. }
  31. }
  32. result.push_back(Interval(left,right));
  33. return result;
  34. }
  35. public:
  36. vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
  37. vector<Interval> result;
  38. intervals.push_back(newInterval);
  39. sort(intervals.begin(),intervals.end(),cmp);
  40. result = merge(intervals);
  41. return result;
  42. }
  43. };

当然还有O(N)的算法可以优化。

分三步来做:

第一步,找到左侧不跟newInterval相交的区间添加到结果中;

第二步,找到所有和newInterval相交的区间并找到其左边界和右边界,然后建立新的interval添加到结果中;

第三部,找到右侧不跟newInterval相交的区间添加到结果中。

注意很多细节在里面可能会犯错

代码:

  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. vector<Interval> result;
  14. if (intervals.size() == ) {
  15. result.push_back(newInterval);
  16. return result;
  17. }
  18. int i = ;
  19. while (i < intervals.size() && intervals[i].end < newInterval.start) {
  20. result.push_back(intervals[i++]);
  21. }
  22. int left = ;
  23. if (i == intervals.size()) {
  24. left = newInterval.start;
  25. }
  26. else {
  27. left = min(newInterval.start,intervals[i].start);
  28. }
  29. while (i < intervals.size() && intervals[i].start <= newInterval.end) {
  30. i++;
  31. }
  32. int right = ;
  33. if (i >= ) {
  34. right = max(newInterval.end, intervals[i - ].end);
  35. }
  36. else {
  37. right = newInterval.end;
  38. }
  39. result.push_back(Interval(left,right));
  40. while (i < intervals.size() ) {
  41. result.push_back(intervals[i++]);
  42. }
  43. return result;
  44. }
  45. };
 

LeetCode57 Insert Interval的更多相关文章

  1. [Java]LeetCode57 Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  2. [Swift]LeetCode57. 插入区间 | Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  3. 【leetcode】Insert Interval

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  4. 60. Insert Interval && Merge Intervals

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  5. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  6. leetcode Insert Interval 区间插入

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...

  7. [OJ] Insert Interval

    LintCode #30. Insert Interval (Easy) LeetCode #57. Insert Interval (Hard) class Solution { public: v ...

  8. 【LeetCode】57. Insert Interval

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  9. Leetcode: Merge/Insert Interval

    题目 Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[ ...

随机推荐

  1. 两年内从零到每月十亿 PV 的发展来谈 Pinterest 的架构设计(转)

    原文:Scaling Pinterest - From 0 To 10s Of Billions Of Page Views A Month In Two Years 译文:两年内从零到每月十亿 PV ...

  2. C#.Net 导出Excel 之单元格 相关设置

    range.NumberFormatLocal = "@";     //设置单元格格式为文本range = (Range)worksheet.get_Range("A1 ...

  3. Android问题-XE5提示"[DCC Fatal Error] Project1.dpr(1): F1027 Unit not found: 'System.pas' or binary equivalents (.dcu/.o)"

    问题现象:Checking project dependencies...Compiling Project1.dproj (Debug, Android)dcc command line for & ...

  4. SQL语句查找重复记录

    select * from AM_C4_ENTRY t where t.created_by in ( select t.created_by from AM_C4_ENTRY t group by ...

  5. ZOJ 3596Digit Number(BFS+DP)

    一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...

  6. iOS多线程总结

    1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 1> 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 2> 子线程 : 后台线程,异步线程 3.不要 ...

  7. android adb服务启动不了解决办法

    当然还有可能是其它的原因,下面是一些解决办法的汇总 因为在对应的文件夹下找不到adb的问题,将android-sdk/platform-tools和android-sdk/tools都加到环境变量中去 ...

  8. 基于jQuery的视频和音频播放器jPlayer

    jPlayer见网络上资料很少,官方英文资料太坑爹TAT,于是就写一个手记给大家参考下.据我观察,jPlayer的原理主要是用到HTML5,在不支持HTML5的浏览器上使用SWF.做到全兼容,这一点很 ...

  9. CentOS6 下安装JDK7

    1.下载JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html,选择Java SE 7,下载jdk-7u80-lin ...

  10. Lync2010升级到2013之账户启用!

    打开ADUC,将用户添加到 csadministrator 组中: