AC牛客 BM89 合并区间

BM89 合并区间

题目描述

描述

给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。

要求:空间复杂度O(n),时间复杂度O(nlogn)
进阶:空间复杂度O(val),时间复杂度O(val)

示例1

输入:
[[10,30],[20,60],[80,100],[150,180]]

返回值:
[[10,60],[80,100],[150,180]]

示例2

输入:
[[0,10],[10,20]]

返回值:
[[0,20]]

解题思路

解法 排序然后合并

1.先将list排序,以start从小到大排序,如果start相等,则以end从小到大排序
2.从index==1,开始遍历list,针对于每两个元素,有以下三种情况

  • 情况一:当前区间完全覆盖上一区间覆盖,则我们直接更新此区间,把上一个区间合入当前区间
  • 情况二:当前区间的左端点严格大于上一区间的右端点,则表示该区间不能合并,则把上一区间加入结果数据
  • 情况三:当前区间与上一区间有相等的区域,那么我们自己合并这两个区间,这儿有个取巧的办法,就是直接求两个start的min,两个end的max,则为合并后的区间
    3.遍历完成,记得把区间的最后一个加入结果

实践代码

解法

import java.awt.image.ImagingOpException;
import java.util.*;

public class Solution {
	public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
		ArrayList<Interval> res = new ArrayList<>();
		if (intervals == null || intervals.size() <= 0) {
			return res;
		}
		Collections.sort(intervals, new Comparator<Interval>() {

			@Override
			public int compare(Interval o1, Interval o2) {
				if (o1.start != o2.start) {
					return o1.start - o2.start;
				} else {
					return o1.end - o2.end;
				}
			}
		});
		for (int i = 1; i < intervals.size(); i++) {
			if (intervals.get(i).start <= intervals.get(i - 1).end) {
				intervals.get(i).start = Math.min(intervals.get(i - 1).start, intervals.get(i).start);
				intervals.get(i).end = Math.max(intervals.get(i - 1).end, intervals.get(i).end);
			} else if (intervals.get(i).start > intervals.get(i - 1).end) {
				res.add(intervals.get(i - 1));
			}
		}
		res.add(intervals.get(intervals.size() - 1));
		return res;
	}
}

你可能感兴趣的:(数据结构与算法,算法,leetcode,排序算法,合并区间)