LeeCode (정렬) 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]는 겹치는 간격으로 간주 될 수 있습니다.
출처 : LeetCode (LeetCode)
링크 : https://leetcode-cn.com/problems/wildcard-matching
저작권은 LeetCode 가 소유합니다. 상업적 재판의 경우 공식 승인에 문의하고 비상업적 재판의 경우 출처를 표시하십시오.
문제 해결 아이디어 :
- 먼저 간격은 간격의 왼쪽 끝에 따라 정렬되며 Arrays.sort 메서드를 사용하여 얻을 수 있습니다 (새 Comparator 인스턴스가 비교 메서드를 재정의 함).
- 병합 된 간격의 수가 불확실하기 때문에 병합 된 결과를 저장하는 데 List <int []> 변수 merged가 사용됩니다.
- 병합 정렬 후 첫 번째 간격을 추가합니다. 두 번째 간격부터 고려해야 할 두 가지 사례가 있습니다.
- 첫 번째 i 번째 간격의 왼쪽 끝 점이 병합 된 마지막 간격의 오른쪽 끝점보다 작거나 같으면 두 간격을 병합 할 수 있으며 마지막으로 병합 된 간격의 오른쪽 끝점은 오른쪽 끝점으로 수정됩니다. 병합 된 마지막 간격 i 번째 간격의 오른쪽 끝점의 최대 값입니다.
- 두 번째 유형에서는 i 번째 간격의 왼쪽 끝 점이 병합 된 마지막 간격의 오른쪽 끝점보다 크고 i 번째 간격이 병합에 직접 추가됩니다.
자바 코드 :
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class 合并区间 {
public int[][] merge(int[][] intervals) {
if(intervals.length == 0)
return new int[0][2];
Arrays.sort(intervals,new Comparator<int[]>() {
@Override
public int compare(int[] interval1, int[] interval2) {
return interval1[0]-interval2[0];
}
});
List<int[]>merged = new ArrayList<int[]>();
for(int i=0;i<intervals.length;i++){
int L = intervals[i][0];
int R = intervals[i][1];
if(merged.size()==0 || merged.get(merged.size()-1)[1]<L){
merged.add(intervals[i]);
}else{
merged.get(merged.size()-1)[1] = Math.max(merged.get(merged.size()-1)[1], R);
}
}
return merged.toArray(new int[merged.size()][]);
}
}