[牛客网-Leetcode] #数组 较难 merge-intervals

合并区间 merge-intervals

题目描述

给出一组区间,请合并所有重叠的区间。
例如,
给出[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].

Given a collection of intervals, merge all overlapping intervals.
For example,
Given[1,3],[2,6],[8,10],[15,18], return[1,6],[8,10],[15,18].

解题思路

  • 首先对intervals数组排序,自定义cmp排序规则时,如果起点不同,则按起点start递增排序,如果起点相同,则按终点end递增排序。
    • 注意,c++类中自定义sort的cmp函数时,要加上static
  • 定义res数组存放合并后的区间结果,初始存入intervals[0]
  • 从第二个元素开始遍历,每次将 intervals[i] 与res数组中的最后一个区间 res.back() 进行比较,分为重叠和不重叠两种情况。

在这里插入图片描述

  • 存在重叠时,直接修改res最后一个区间的end即可,即合并两个区间
    res.back().end = max(res.back().end, intervals[i].end)
  • 不存在重叠时,直接将当前区间intervals[i]加入res即可,即不需要合并,产生新的区间
/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
    
    
public:
    //注意,c++类中自定义sort的cmp函数时,要加上static
    static bool cmp(Interval a, Interval b) {
    
    
        if(a.start != b.start) {
    
    //如果起点不同,则按起点递增排序
            return a.start < b.start;
        } else {
    
                    //如果起点相同,则按终点递增排序
            return a.end < b.end;
        }
    }
    vector<Interval> merge(vector<Interval> &intervals) {
    
    
        vector<Interval> res;
        int size = intervals.size();
        if(!size) return res;
        sort(intervals.begin(), intervals.end(), cmp);
        res.push_back(intervals[0]);
        
        for(int i = 1; i < size; i ++) {
    
    
            Interval temp = intervals[i];
            //如果两个区间存在重叠
            if(temp.start <= res.back().end) {
    
    
                res.back().end = max(res.back().end, temp.end);
            } else {
    
      //如果两个区间不存在重叠
                res.push_back(temp);
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/cys975900334/article/details/106598671