- 算法
- 1.以区间左边界为基准排序区间
- 2.滑动窗口,start窗口左边界,end窗口右边界
- 3.往前滑动,当end不在下一个区间之中时,得到一个合并区间停止滑动,移动到下一个区间接着滑动
// 牛客核心代码 public ArrayList<Interval> merge(ArrayList<Interval> intervals) { if (intervals == null || intervals.size() == 0) { return new ArrayList<Interval>(10); } intervals.sort((a, b) -> (a.start - b.start)); ArrayList<Interval> result = new ArrayList<>(10); int start = intervals.get(0).start; int end = intervals.get(0).end; for (int i = 1; i < intervals.size(); i++) { if (end < intervals.get(i).start) { result.add(new Interval(start, end)); start = intervals.get(i).start; } end = Math.max(end, intervals.get(i).end); } result.add(new Interval(start, end)); return result; }
// LeetCode核心代码 public int[][] merge(int[][] intervals) { if (intervals == null || intervals.length == 0) { return new int[0][2]; } Arrays.sort(intervals, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : a[0] - b[0])); ArrayList<int[]> list = new ArrayList<>(10); int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < intervals.length; i++) { if (end < intervals[i][0]) { list.add(new int[]{start, end}); start = intervals[i][0]; } end = Math.max(end, intervals[i][1]); } list.add(new int[]{start, end}); int[][] result = new int[list.size()][]; for (int i = 0; i < list.size(); i++) { result[i] = list.get(i); } return result; }