示例 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; } }
ArrayList和LinkedList的大體區別:
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinkedList比較佔優點,由於ArrayList要移動數據。數據結構
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函數