题解 | #合并区间#
合并区间
https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a
小数据O(nlgn), 大数据O(n), 空间复杂度不保证,不过感觉也没那么大吧! import java.util.*; /* * public class Interval { * int start; * int end; * public Interval(int start, int end) { * this.start = start; * this.end = end; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param intervals Interval类ArrayList * @return Interval类ArrayList */ public ArrayList<Interval> merge (ArrayList<Interval> intervals) { int n = intervals.size(); if (n < 2) { return intervals; } ArrayList<Interval> intervalAux = new ArrayList<>(intervals); if (n < 10000) { mergeSort(intervals, intervalAux, 0, intervals.size() - 1); } else { intervals = radixSort(intervals); } ArrayList<Interval> retList = new ArrayList<>(); Interval tmp; for (Interval interval : intervals) { if (!retList.isEmpty() && retList.get(retList.size() - 1).end >= interval.start) { tmp = retList.remove(retList.size() - 1); tmp.end = Math.max(interval.end, tmp.end); retList.add(tmp); } else { retList.add(interval); } } return retList; } private ArrayList<Interval> radixSort(ArrayList<Interval> intervals) { int max = 0; for (Interval interval : intervals) { if (max < interval.start) { max = interval.start; } } Interval[] intervalArray = new Interval[max + 1]; for (Interval interval : intervals) { if (intervalArray[interval.start] == null) { intervalArray[interval.start] = interval; } else { intervalArray[interval.start].end = Math.max(intervalArray[interval.start].end, interval.end); } } ArrayList<Interval> intervalList = new ArrayList<>(); for (int i = 0; i <= max; i++) { if (intervalArray[i] != null) { intervalList.add(intervalArray[i]); } } return intervalList; } private void mergeSort(ArrayList<Interval> intervals, ArrayList<Interval> intervalAux, int lo, int hi) { if (lo + 15 >= hi) { insertSort(intervals, lo, hi); return; } int mid = lo + (hi - lo) / 2; mergeSort(intervalAux, intervals, lo, mid); mergeSort(intervalAux, intervals, mid + 1, hi); int left = lo, right = mid + 1; for (int i = lo; i <= hi; i++) { intervals.remove(i); if (left > mid) { intervals.add(i, intervalAux.get(right++)); } else if (right > hi) { intervals.add(i, intervalAux.get(left++)); } else if (intervalAux.get(left).start <= intervalAux.get(right).start) { intervals.add(i, intervalAux.get(left++)); } else { intervals.add(i, intervalAux.get(right++)); } } } private void insertSort(ArrayList<Interval> intervals, int lo, int hi) { if (lo >= hi) { return; } Interval tmp, tmp1; for (int i = lo + 1; i <= hi; i++) { if (intervals.get(i).start < intervals.get(i - 1).start) { tmp = intervals.get(i); int j = i; while (j > lo && tmp.start < intervals.get(j - 1).start) { tmp1 = intervals.get(j - 1); intervals.remove(j); intervals.add(j, tmp1); j--; } intervals.remove(j); intervals.add(j, tmp); } } } }