leetcode| 56. 合併區間

給出一個區間的集合,請合併全部重疊的區間。

示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併爲 [1,6].java

示例 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基於鏈表的數據結構。
    2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
    3.對於新增和刪除操做add和remove,LinkedList比較佔優點,由於ArrayList要移動數據。數據結構

  2. ans.add(new int[]{x, y})
    add方法只會將引用地址放入集合中,每次add須要new一個對象。
    add函數源碼:
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++;
    }

結點的添加僅操做了地址。
ide

連接:https://leetcode-cn.com/problems/merge-intervals函數

相關文章
相關標籤/搜索