간격의 집합을 감안할 때, 모든 중복 간격을 병합합니다.
실시 예 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]을 오버랩 기간으로 간주 될 수있다.
사고
은 "알고리즘 소개"를 오름차순으로 왼쪽 지점에 따라 간격 - 활성 선택.
O (nlgn), O (N)의 공간적 복잡도의 시간 복잡도.
코드
class Solution {
public int[][] merge(int[][] intervals) {
int length = intervals.length;
if(length < 2) return intervals;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if(a[0] == b[0]) {
return b[1] - a[1];
} else {
return a[0] - b[0];
}
}
});
List<int[]> ans = new LinkedList<int[]>();
int x = intervals[0][0];
int y = intervals[0][1];
for(int i = 1; i < length; i++) {
if(intervals[i][0] > y) {
ans.add(new int[]{x, y});
x = intervals[i][0];
y = intervals[i][1];
} else if(intervals[i][1] > y) {
y = intervals[i][1];
}
}
ans.add(new int[]{x, y});
int n = 0;
int[][] res = new int[ans.size()][2];
for(int[] i : ans) {
res[n][0] = i[0];
res[n++][1] = i[1];
}
return res;
}
}
주의 사항
대략의 ArrayList와 LinkedList의 차이는 :
1.ArrayList 동적 데이터 구조 배열 기반 링크리스트 데이터 구조 기반 LinkedList의 실현이다.
LinkedList의 포인터를 이동하기 때문에 랜덤 액세스를 얻거나 설정한다 2., ArrayList를 더 나은 LinkedList의보다 생각합니다.
ArrayList에 데이터를 이동하기 때문에 새로운 및 삭제 작업 3. 추가 및 제거, LinkedList의 비교 우위.- ans.add (새 INT [{X, Y})
추가 방법은 세트에서 단지 참조 주소, 매번 새로운 요구 객체를 추가하는 것이다.
기능 소스를 추가 :
public boolean add(E e) {
linkLast(e);
return true;
}
/**
* Links e as last element.
*/
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
추가는 노드 주소를 운영했다.
링크 : HTTPS : //leetcode-cn.com/problems/merge-intervals