[LeetCode]56. Merge Intervals

合并数组

Posted by JinFei on August 2, 2020

题目描述

Given a collection of intervals, merge all overlapping intervals.

Example1:

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].

Example2:

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

Note:

input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

解题思路

  • 这一题首先要进行排序操作,要求每个vector第一个表示是升序操作
  • 按题意,分为几种情况
      1. 循环从 0 - > size - 1 // 因为中间会改变 i + 1 的值,这样只需要在最后面将改变后的值给追加进行即可
      1. 如果 intervals[i][1] < intervals[i + 1][0] 即 [1,6],[8,10] 的情况 // 不能合并的情况,直接push到最后的结果即可
      1. 如果 intervals[i][1] >= intervals[i + 1][0] && intervals[i][1] < intervals[i + 1][1] // 可以合并的情况,需要满足 [1,3],[2,6] 即可, 这样 给 intervals[i + 1][0] 赋值即可
      1. 剩余的就是 [1,12], [3,4] 这种 // 这样 需要给 intervals[i + 1][0], intervals[i + 1][1] 赋值
    • 最后记得要把循环条件结束时,把改变后的 最后一个元素 push 进去即可
class Solution {
public:
    static bool cmp(vector<int>& vec1, vector<int>& vec2){  // 对vector<vector<int>> 进行排序,则形参为里面解除一层的vector<int>引用
        return vec1[0] < vec2[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size() == 0){
            return {};
        }
        vector<vector<int>> res;
        sort(intervals.begin(), intervals.end(), cmp);
        int i = 0;
        while(i < intervals.size() - 1){
            if(intervals[i][1] < intervals[i + 1][0]){
                res.push_back(intervals[i]);
            }else if(intervals[i][1] >= intervals[i + 1][0] && intervals[i][1] < intervals[i + 1][1]){
                intervals[i + 1][0] = intervals[i][0];
            }else{
                intervals[i + 1][0] = intervals[i][0];
                intervals[i + 1][1] = intervals[i][1];
            }
                
            ++i;
        }
        res.push_back(intervals[i]);
        return res;
    }
};