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 = a, 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;
    // }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值