zoukankan      html  css  js  c++  java
  • Merge Intervals & Insert Interval

    56. Merge Intervals

    题目链接:https://leetcode.com/problems/merge-intervals/#/description

    题目大意:给定区间的集合,合并所有有重叠的区间,然后返回合并区间后的集合

    思路:A和B两个区间合并的条件A.start <= B.start <= A.end or B.start <= A.start <= B.end,如果先对集合进行排序,则合并条件左半部分可以满足,遍历时判断合并条件的右半部分即可。

    算法步骤:(1)对区间集合进行排序,排序的键为区间的start;(2)遍历集合,判断当前区间与下一区间能否合并,如果可以合并,将当前区间更新为当前区间和下一区间的合并,否则更新当前区间为下一区间

    算法复杂度:时间复杂度O(nlog(n)),空间复杂度O(n)

    代码:

     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> merge(vector<Interval>& intervals) {
    13         sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){return a.start < b.start;});
    14         vector<Interval> res;
    15         if (intervals.size() > 0) {
    16             res.push_back(intervals[0]);
    17             for (auto &interval : intervals) {
    18                 if (res.back().end < interval.start)
    19                     res.push_back(interval);
    20                 else
    21                     res.back().end = max(res.back().end, interval.end);
    22             }
    23         }
    24         return res;
    25     }
    26 };

    评测系统上运行结果:

    57. Insert Interval

    题目链接:https://leetcode.com/problems/insert-interval/#/description

    题目大意:给定一个互相没重叠的排好序的区间集合,现在要插入一个区间,区间插入后如果区间之间有重叠,需要对重叠的区间进行合并。

    思路:遍历集合,如果当前区间和待插入的区间的重叠,更新待插入的区间为当前区间和待插入区间的合并

    算法步骤:(1)找出所有在待插入区间左侧的区间(不重叠)(2)合并所有和待插入区间有重叠的区间(3)找出所有在待插入区间右侧的区间(不重叠)

    算法复杂度:时间复杂度O(n),空间复杂度O(n)

    代码:

     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         auto begin = intervals.cbegin();
    14         vector<Interval> res;
    15         while (begin != intervals.cend() && begin->end < newInterval.start)
    16             res.push_back(*begin++);
    17         while (begin != intervals.cend() && begin->start <= newInterval.end) {
    18             newInterval.start = min(begin->start, newInterval.start);
    19             newInterval.end = max(begin->end, newInterval.end);
    20             ++begin;
    21         }
    22         res.push_back(newInterval);
    23         while (begin != intervals.cend())
    24             res.push_back(*begin++);
    25         return res;
    26     }
    27 };

    评测系统上运行结果:

  • 相关阅读:
    SOHO路由器
    SYN Flood
    Java线程池
    BIO
    Java虚拟机的基本结构
    Linux 的Ext2
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    cassandra-CQL
    数列分段`Section II`(二分
    Exams(二分
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6545579.html
Copyright © 2011-2022 走看看