[牛 客 网 -Leetcode] # 배열은 간격을 병합하기가 어렵습니다

병합- 간격

제목 설명

일련의 간격이 주어지면 모든 겹치는 간격을 병합하십시오.
예를 들어
[1,3], [2,6], [8,10], [15,18]이 주어지면
[1,6], [8,10], [15,18]을 반환합니다.

간격 모음이 주어지면 모든 겹치는 간격을 병합합니다.
예 :
Given [1,3], [2,6], [8,10], [15,18], return [1,6], [8,10], [15,18].

문제 해결 아이디어

  • 먼저 intervals 배열을 정렬합니다 .cmp 정렬 규칙을 사용자 정의 할 때 시작점이 다른 경우 시작점이 오름차순으로 정렬되고 시작점이 동일하면 끝 점이 오름차순으로 정렬됩니다.
    • C ++ 클래스에서 정렬의 cmp 함수를 사용자 정의 할 때 정적을 추가해야합니다.
  • 처음에 intervals [0]에 저장된 결합 된 간격 결과를 저장할 res 배열을 정의합니다.
  • 두 번째 요소에서 순회를 시작하고 매번 res 배열의 마지막 간격 res.back ()과 intervals [i]를 비교합니다. 두 가지 경우가 있습니다 : 겹침과 비 겹침.

여기에 사진 설명 삽입

  • 겹치는 부분이있는 경우 마지막 res 간격의 끝을 직접 수정할 수 있습니다. 즉, 두 간격을 병합합니다
    . res.back (). end = max (res.back (). end, intervals [i] .end)
  • 겹침이없는 경우 현재 간격 간격 [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