병합- 간격
제목 설명
일련의 간격이 주어지면 모든 겹치는 간격을 병합하십시오.
예를 들어
[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;
}
};