• leetcode 56. Merge Intervals


    Given a collection of intervals, merge all overlapping intervals.

    Example 1:

    Input: [[1,3],[2,6],[8,10],[15,18]]
    Output: [[1,6],[8,10],[15,18]]
    Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
    

    Example 2:

    Input: [[1,4],[4,5]]
    Output: [[1,5]]
    Explanation: Intervals [1,4] and [4,5] are considered overlapping.

    题目大意:合并区间,[1,3]和[2,6]有交集,合并[1,6]。

    思路一:先将数组排序,优先根据区间的第一个数排序,小的排在前面,如果区间第一个数相同,根据区间第二个数从小到大排序。

    假设下标 i 指向排好序的第i个区间,从第 i + 1个区间[c, d]开始合并与第i个区间[a, b]有交集的区间。由于排好序,如果第i + 1个区间与第i个数没有交集,后面的区间必然没有交集。

    假如第i + 1个区间[c, d]的第一个数c在第i个区间[a, b]内,则合并。如果d >= b, 说明合并后的区间要更新,否则(d < b)说明[c, d]在[a, b]内部。

     1 class Solution {
     2     static bool cmp(vector<int> a, vector<int> b) {
     3         if (a[0] != b[0])
     4             return a[0] < b[0];
     5         else 
     6             return a[1] < b[1];
     7     }
     8 public:
     9     vector<vector<int>> merge(vector<vector<int>>& intervals) {
    10         vector<vector<int> > res;
    11         sort(intervals.begin(), intervals.end(), cmp);
    12         for (int i = 0; i < intervals.size();) {
    13             vector<int> tmp(2, 0); //用于保存每一轮合并的区间
    14             tmp[0] = intervals[i][0], tmp[1] = intervals[i][1]; //一开始初始化合并区间为当前的区间
    15             while (++i < intervals.size() && (intervals[i][0] <= tmp[1])) { //从当前区间后一个区间开始判断
    16                 if (intervals[i][1] >= tmp[1])
    17                     tmp[1] = intervals[i][1];
    18             }
    19             res.push_back(tmp);
    20         }
    21         return res;
    22     }
    23 };

    时间复杂度: O(NlogN), 空间复杂度 O(1)

    思路二:

  • 相关阅读:
    C的联合体和结构体区别
    1_大端模式和小端模式
    1_2017年中兴机试题
    树1---基础
    栈的应用2---后缀表达式
    2 链式存储栈
    2- 栈和队列----之栈
    2) 线性链表
    kaike的FLAGs
    QAQ来自弱鸡的嘲笑
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11637443.html
Copyright © 2020-2023  润新知