[LeetCode] 56. Merge Intervals
Problem
Given an array of intervals
where intervals[i] = [starti, endi]
, merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
Example 1:
Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6].
Example 2:
Input: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
Constraints:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 10^4
Solution
class Solution {
public int[][] merge(int[][] intervals) {
int[] start = new int[intervals.length];
int[] end = new int[intervals.length];
for (int i = 0; i < intervals.length; i++) {
start[i] = intervals[i][0];
end[i] = intervals[i][1];
}
Arrays.sort(start);
Arrays.sort(end);
int startIndex = 0;
int endIndex = 0;
List<int[]> list = new ArrayList<int[]>();
while (endIndex < intervals.length) {
if (endIndex == intervals.length - 1 || end[endIndex] < start[endIndex + 1]){
list.add(new int[]{start[startIndex], end[endIndex]});
startIndex = endIndex + 1;
} endIndex++;
} return list.toArray(new int[list.size()][]);
}
}
Explanation
배열 intervals
에서 인접한 두 배열이 겹치는지를 알기 위해선앞 배열의 뒷 요소
와뒷 배열의 앞 요소
를 비교해야 한다. 뒷 배열의 앞 요소가 앞 배열의 뒷 요소보다 작다면 두 배열은 겹쳐지는 부분이 있는 것이고, 하나의 배열로 합쳐져야 한다.앞 배열의 뒷 요소
와뒷 배열의 앞 요소
를 쉽게 비교하기 위해서 각 요소를 배열을 선언하고,for 반복문
을 사용하여 각 요소를 담는다.
int[] start = new int[intervals.length];
int[] end = new int[intervals.length];
for (int i = 0; i < intervals.length; i++) {
start[i] = intervals[i][0];
end[i] = intervals[i][1];
}
- 이 때,
배열 start
와배열 end
가 정렬되어 있지 않다면 잘못된interval
을 생성할 수 있는 경우의 수가 생기므로 두 배열을 정렬해준다.Arrays.sort(start); Arrays.sort(end);
- 반복을 통해
배열 start
와배열 end
속 요소를 비교하고, 새로운interval
을 만들기 위해 각 배열 속 요소를 참조하는변수 startIndex
와변수 endIndex
를 선언한다. - 결과 반환은 2차원 배열로 해야하지만, 배열은 크기를 조정할 수 없으므로, 결과 반환을 위한 리스트를 선언한다.
int startIndex = 0; int endIndex = 0; List<int[]> list = new ArrayList<int[]>();
while 반복문
을 선언해서배열 start
와배열 end
의 값을 비교한 후 새로운interval
을 만들고, 리스트에 추가하도록 한다.while (endIndex < intervals.length) { if (endIndex == intervals.length - 1 || end[endIndex] < start[endIndex + 1]){ list.add(new int[]{start[startIndex], end[endIndex]}); startIndex = endIndex + 1; } endIndex++; }
- 리스트를 2차원 배열로 변경하여 반환하도록 한다.
return list.toArray(new int[list.size()][]);
Leave a comment