56. 合并区间

题目

给出一个区间的集合,请合并所有重叠的区间。

示例1

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例2

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路

  • 首先每个元素都是一个数组,有两个元素。先按照第一个元素的大小对二维数组排序。
  • 然后开始遍历数组,使用left记录区间的左边,right记录区间的右边。当前元素的第一、第二个值用a、b表示。
  • 如果a <= right, 则说明[left, right]和[a, b]有交集。则更新right = max (right, b)。
  • 如果a > right, 则说明没交集,此时将{left, right}保存到结果中。然后更新left = 1, right = b, 继续遍历数组。

代码

class Solution {
public:
    static bool lessThan( const vector<int>& a, const vector<int>& b ) {
        return a[0] < b[0];
    }

    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if ( intervals.size() == 0 ) return {};
        if ( intervals.size() == 1 ) return intervals;

        vector<vector<int>> res;

        // mySort( intervals, 0, intervals.size() - 1 );
        sort( intervals.begin(), intervals.end(), lessThan );

        int i = 0;
        while ( i < intervals.size() ) {
            int left = intervals[i][0];
            int right = intervals[i][1];

            while ( i < intervals.size() - 1 && intervals[i+1][0] <= right ) {
                right = max( right, intervals[i+1][1] );
                ++i;
            }
            
            res.push_back( { left, right } );

            ++i;
        }

        return res;
    }

    // void mySort( vector<vector<int>>& nums, int lo, int hi ) {
    //     if ( lo >= hi ) return;

    //     int mid = partition( nums, lo, hi );

    //     mySort( nums, lo, mid - 1 );
    //     mySort( nums, mid + 1, hi );

    //     return;
    // }

    // int partition( vector<vector<int>>& nums, int lo, int hi ) {
    //     int index = rand() % ( hi - lo + 1) + lo;
    //     swap( nums[lo], nums[index] );
    //     vector<int> pivot = nums[lo];

    //     while ( lo < hi ) {
    //         while ( lo < hi && pivot[0] <= nums[hi][0] )
    //             --hi;
            
    //         nums[lo] = nums[hi];

    //         while ( lo < hi && pivot[0] > nums[lo][0] )
    //             ++lo;

    //         nums[hi] = nums[lo];
    //     }

    //     nums[lo] = pivot;

    //     return lo;
    // }

    // void swap( vector<int>& a, vector<int>& b ) {
    //     vector<int> temp = a;
    //     a = b;
    //     b = temp;

    //     return;
    // }
};
上一篇:56.合并区间


下一篇:在Python上编码计算器