LeeCode (정렬) 56_ 병합 간격

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 가 소유합니다. 상업적 재판의 경우 공식 승인에 문의하고 비상업적 재판의 경우 출처를 표시하십시오.

문제 해결 아이디어 :

  1. 먼저 간격은 간격의 왼쪽 끝에 따라 정렬되며 Arrays.sort 메서드를 사용하여 얻을 수 있습니다 (새 Comparator 인스턴스가 비교 메서드를 재정의 함).
  2. 병합 된 간격의 수가 불확실하기 때문에 병합 된 결과를 저장하는 데 List <int []> 변수 merged가 사용됩니다.
  3. 병합 정렬 후 첫 번째 간격을 추가합니다. 두 번째 간격부터 고려해야 할 두 가지 사례가 있습니다.
  4. 첫 번째 i 번째 간격의 왼쪽 끝 점이 병합 된 마지막 간격의 오른쪽 끝점보다 작거나 같으면 두 간격을 병합 할 수 있으며 마지막으로 병합 된 간격의 오른쪽 끝점은 오른쪽 끝점으로 수정됩니다. 병합 된 마지막 간격 i 번째 간격의 오른쪽 끝점의 최대 값입니다.
  5. 두 번째 유형에서는 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()][]);
    }
}

추천

출처blog.csdn.net/u013456390/article/details/111915097