zoukankan      html  css  js  c++  java
  • 19.2.9 [LeetCode 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:

    Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
    Output: [[1,5],[6,9]]
    

    Example 2:

    Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
    Output: [[1,2],[3,10],[12,16]]
    Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

    题意

    给定一组以左边界大小排列的互不重合的闭区间,求加入一个新区间后的集合(也需要从小到大排列)

    题解

    一开始做的十分复杂

     1 class Solution {
     2 public:
     3     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
     4         if (intervals.size() < 1) {
     5             intervals.push_back(newInterval);
     6             return intervals;
     7         }
     8         int s = newInterval.start, e = newInterval.end, i;
     9         for (i = 0; i < intervals.size(); i++) {
    10             if (intervals[i].start <= s && intervals[i].end >= s) {
    11                 if (e <= intervals[i].end)
    12                     return intervals;
    13                 break;
    14             }
    15             else if (intervals[i].start > s) {
    16                 if(intervals[i].start>e) {
    17                     intervals.insert(intervals.begin()+i,newInterval);
    18                     return intervals;
    19                 }
    20                 intervals[i].start = s;
    21                 if (e <= intervals[i].end)
    22                     return intervals;
    23                 break;
    24             }
    25         }
    26         int mark = i;
    27         i++;
    28         for (; i < intervals.size(); ) {
    29             if (intervals[i].start > e) {
    30                 intervals[mark].end = e;
    31                 return intervals;
    32             }
    33             else if (intervals[i].end >= e) {
    34                 intervals[mark].end = intervals[i].end;
    35                 intervals.erase(intervals.begin() + i);
    36                 return intervals;
    37             }
    38             intervals.erase(intervals.begin() + i);
    39         }
    40         if(mark>=intervals.size())
    41             intervals.push_back(newInterval);
    42         else
    43             intervals[mark].end = e;
    44         return intervals;
    45     }
    46 };
    View Code

    需要考虑很多条件,于是重写

     1 class Solution {
     2 public:
     3     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
     4         int i = 0, s = newInterval.start, e = newInterval.end;
     5         vector<Interval>ans;
     6         while (i < intervals.size() && intervals[i].end < s) {
     7             ans.push_back(intervals[i]);
     8             i++;
     9         }
    10         int left = s, right = e;
    11         while (i < intervals.size() && intervals[i].start <= e) {
    12             left = min(left, intervals[i].start);
    13             right = max(right, intervals[i].end);
    14             i++;
    15         }
    16         ans.push_back(Interval(left, right));
    17         while (i < intervals.size()) {
    18             ans.push_back(intervals[i]);
    19             i++;
    20         }
    21         return ans;
    22     }
    23 };
    View Code

    这个就快得多了……

  • 相关阅读:
    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
    算法七:广度优先搜索
    sqldependency 支持的select
    ghostDoct 使用 (转 http://www.cnblogs.com/RockyMyx/archive/2010/04/20/Project-Route-Using-GhostDoc.html)
    Jenkins 使用学习笔记
    C# 反射类型转换
    时间分割线:2016年1月的文章都是从以前chinaunix的博客文章
    Error 42 error C2784: 'bool std::operator <(const std::_Tree<_Traits>
    JNI的类路径问题
    【转】不用临时变量也可以交换变量的值
  • 原文地址:https://www.cnblogs.com/yalphait/p/10357529.html
Copyright © 2011-2022 走看看