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

    思路:

    对于有n个区间的vector,分成了2*n+1个部分。根据这个性质,对于一个新的interval,先判断它的左右点都在哪一部分,然后将被覆盖的部分删除即可。

    下面代码中findIndex负责找到某个int值所在的区域。

    代码:

     1     int findIndex(vector<Interval> &intervals, int val){
     2         int n = intervals.size();
     3         if(val < intervals[0].start) 
     4             return 0;
     5         if(val > intervals[n-1].end)
     6             return 2*n;
     7         for(int i = 0; i < n; i++){
     8             if(val >= intervals[i].start && val <= intervals[i].end)
     9                 return 2*i+1;
    10             if(i < n-1 && val > intervals[i].end && val < intervals[i+1].start)
    11                 return 2*i+2;
    12             if(i > 0 && val > intervals[i-1].end && val < intervals[i].start)
    13                 return 2*i;
    14         }
    15     }
    16     vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
    17         // IMPORTANT: Please reset any member data you declared, as
    18         // the same Solution instance will be reused for each test case.
    19         if(intervals.size() == 0){
    20             intervals.push_back(newInterval);
    21             return intervals;
    22         }
    23         int size = intervals.size();
    24         int s = findIndex(intervals, newInterval.start), e = findIndex(intervals, newInterval.end);
    25         cout<<s<<"-"<<e<<endl;
    26         if(s%2 == 1){
    27             newInterval.start = intervals[s/2].start;
    28         }
    29         if(e%2 == 1){
    30             newInterval.end = intervals[e/2].end;
    31         }
    32         if(s == e){
    33             if(s%2 != 1)
    34                 intervals.insert(intervals.begin()+s/2, newInterval);
    35         }
    36         else{
    37             s /= 2;
    38             if(e%2 == 0)
    39                 e /= 2;
    40             else
    41                 e = e/2+1;
    42             if(e > size)
    43                 e = size;
    44             cout<<s<<"-"<<e<<endl;
    45             intervals.erase(intervals.begin()+s, intervals.begin()+e);
    46             intervals.insert(intervals.begin()+s, newInterval);
    47         }
    48         return intervals;
    49     }  
  • 相关阅读:
    日报11.1
    CCC2020 Surmising a Sprinter's Speed
    3D扫雷 (3D Minesweeper)
    如何使用小米手环与PN532(或类似芯片)复制验证卡号的IC卡
    分享一个api:随机二次元图片
    NOIP2017 时间复杂度 大模拟
    《区块链100问》笔记整理——42~49问
    Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)
    Coursera-AndrewNg(吴恩达)机器学习笔记——第四周
    《区块链100问》笔记整理——23~41问
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3438287.html
Copyright © 2011-2022 走看看