zoukankan      html  css  js  c++  java
  • LeetCode OJ: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].

      类似以前的merge Intervals,只不过这里实际上是要将一个Interval插入到内部之后,然后再merge一下
    而且这里的intervals在这里首先是已经排好序了的:

    首先是一个带二分搜索的C++的方法:

     1 class Solution {
     2 public:
     3     static bool comp(Interval a,Interval b){
     4         return a.start<b.start;
     5     }
     6     vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
     7         if(intervals.size()==0){
     8             intervals.push_back(newInterval);
     9             return intervals;
    10         }
    11         // sort(intervals.begin(),intervals.end(),comp);
    12         if(intervals[0].start>newInterval.end){
    13             intervals.insert(intervals.begin(),newInterval);
    14             return intervals;
    15         }
    16         else if(intervals[intervals.size()-1].end<newInterval.start){
    17             intervals.push_back(newInterval);
    18             return intervals;
    19         }
    20         int left = binaryS(newInterval.start,intervals,0,intervals.size()-1, true);
    21         int right = binaryS(newInterval.end, intervals,left, intervals.size()-1,false);
    22         int delLeft,delRight;
    23         cout<<left<<right;
    24         if(left == 0 && intervals[0].start>newInterval.start){
    25             delLeft = left;
    26         }
    27         else if(intervals[left].end>= newInterval.start){
    28             newInterval.start = intervals[left].start;
    29             delLeft = left;
    30         }
    31         else{
    32             delLeft = left+1;
    33         }
    34 
    35         if(right == intervals.size()-1 && intervals[right].end<newInterval.end){
    36             delRight = right;
    37         }
    38         else if(intervals[right].start<= newInterval.end){
    39             newInterval.end = intervals[right].end;
    40             delRight = right;
    41         }
    42         else{
    43             delRight = right-1;
    44         }
    45         cout<<delLeft<<" "<<delRight<<endl;
    46         vector<Interval> result;
    47 
    48         for(int i=0;i<delLeft;i++){
    49             result.push_back(intervals[i]);
    50         }
    51         result.push_back(newInterval);
    52         for(int i=delRight+1;i<intervals.size();i++){
    53             result.push_back(intervals[i]);
    54         }
    55         return result;
    56         // for(int i=delLeft;i<=delRight;i++){
    57         //     intervals.erase(intervals.begin()+delLeft);
    58         // }
    59         // intervals.push_back(newInterval);
    60         // return intervals;
    61     }
    62     int binaryS(int x, vector<Interval> & intervals, int low, int high, bool isStart){
    63         if(isStart){
    64 
    65 
    66             while(low < high){
    67                 int mid = (low + high +1 ) /2;
    68                  cout<<low<<high;
    69                 if(intervals[mid].start <= x){
    70                     low = mid;
    71                 }
    72                 else{
    73                     high = mid-1;
    74                 }
    75             }
    76         }
    77         else{
    78             while(low < high){
    79                 int mid = (low + high) /2;
    80                 // cout<<low<<high;
    81                 if(intervals[mid].end < x){
    82                     low = mid+1;
    83                 }
    84                 else{
    85                     high = mid;
    86                 }
    87             }
    88         }
    89         return low;
    90     }
    91 };

    java版本的代码如下所示:

     1 /**
     2  * Definition for an interval.
     3  * public class 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 public class Solution {
    11     public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
    12         List<Interval> ret = new ArrayList<Interval>();
    13         int sz = intervals.size();
    14         if(sz == 0){
    15             ret.add(newInterval);
    16             return    ret;
    17         }
    18         int prev = 0, next = 1;
    19         while(next < sz){
    20             if(newInterval != null && intervals.get(prev).end >= newInterval.start){
    21                 intervals.get(prev).end = Math.max(intervals.get(prev).end, newInterval.end);
    22                 newInterval = null;
    23             }else if(newInterval == null){
    24                 if(intervals.get(prev).end >= intervals.get(next).start){
    25                     intervals.get(prev).end = Math.max(intervals.get(prev).end, intervals.get(next).end);
    26                     next++;
    27                 }else{
    28                     ret.add(intervals.get(prev));
    29                     prev = next;
    30                     next++;
    31                 }
    32             }else{
    33                 ret.add(intervals.get(prev));
    34                 prev++;
    35                 next++;
    36             }
    37         }
    38         intervals.get(prev).end = Math.max(intervals.get(prev).end, intervals.get(sz-1).end);
    39         ret.add(intervals.get(prev));
    40         return ret;
    41     }
    42 }
  • 相关阅读:
    经典哦,男女3.8,8.3
    在web窗体设计器中未能加载该文件
    使用客户端脚本
    C#的数据类型
    实验下cookie
    C#中Split分隔字符串的应用
    未将对象引用设置到对象的实例
    System.StackOverflowException 的异常;jit调试失败
    DataGrid中添加删除确认对话框 多种实现
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/5563536.html
Copyright © 2011-2022 走看看