https://leetcode.com/problems/merge-intervals/description/
코드설명
구현(Implementation) 을 활용합니다.
만약 첫번쨰 Interval의 end 범위가 두번쨰 Interval의 start 범위보다 크다면, 즉, sInterval.end >= nInteraval.start 라면 Merge합니다.
이떄 중요사항은, Math.max로 처리해야 합니다. 이유는 Interval의 nInterval을 포함하는 경우도 Merge 하는 경우라고 판단하기 때문입니다.
혹은 UnionFind로도 풀 수 있습니다만, 아래의 구현이 훨씬 직관적이며 쉽습니다.
또한 아래의 코드에서 new Comparator<int[]> 를 직접 구현한점, 그리고 ArrayList를 answer.toArray(new int[answer.size()][])로 편하게 변환한점을 눈여겨보면 좋습니다.
코드
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2){
return Integer.compare(o1[0], o2[0]);
}
});
ArrayList<int[]> answer = new ArrayList<>();
int[] sInterval = intervals[0];
for(int i=1; i<intervals.length; i++){
if(sInterval[1] >= intervals[i][0]){
sInterval[1] = Math.max(sInterval[1], intervals[i][1]);
}
else {
answer.add(new int[] {sInterval[0], sInterval[1]});
sInterval[0] = intervals[i][0];
sInterval[1] = intervals[i][1];
}
}
answer.add(sInterval);
return answer.toArray(new int[answer.size()][]);
}
}