leetcode | 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]을 오버랩 기간으로 간주 될 수있다.

사고

은 "알고리즘 소개"를 오름차순으로 왼쪽 지점에 따라 간격 - 활성 선택.
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;
    }
}

주의 사항

  1. 대략의 ArrayList와 LinkedList의 차이는 :
    1.ArrayList 동적 데이터 구조 배열 기반 링크리스트 데이터 구조 기반 LinkedList의 실현이다.
    LinkedList의 포인터를 이동하기 때문에 랜덤 액세스를 얻거나 설정한다 2., ArrayList를 더 나은 LinkedList의보다 생각합니다.
    ArrayList에 데이터를 이동하기 때문에 새로운 및 삭제 작업 3. 추가 및 제거, LinkedList의 비교 우위.

  2. 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

추천

출처www.cnblogs.com/ustca/p/12295671.html