[leetcode]Merge Intervals

不得不说,这个算法还是不错的,就是Collections.sort()方法不会用。。。

 

新博文地址:[leetcode]Merge Intervals

 

Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

 这道题很容易,个人感觉比Insert Interval 还容易,题意就不多啰嗦了,直接说下算法吧:

首先按照start递增排序,然后逐个插入处理,本来懒得动脑,用的类似于比较排序的方式找list中最小的interval,时间复杂度为O(n*n),毫不意外的超时了,因此第二次用了类似于计数排序方式,时间复杂度,空间复杂度都为O(n)。

这里有个坑[1,2],[2,3]在Insert Interval 中是不合并的,但是在这道题中是合并的,不过对难度无影响

 public List<Interval> merge(List<Interval> intervals) {
		List<Interval> list = new ArrayList<Interval>();
		if (intervals == null || intervals.size() == 0) {
			return list;
		}
		int min = Integer.MAX_VALUE;
		int max = Integer.MIN_VALUE;
		Map<Integer, List<Interval>> map = new HashMap<Integer, List<Interval>>();

		for (Interval inter : intervals) {
			min = inter.start < min ? inter.start : min;
			max = inter.start > max ? inter.start : max;
			if (map.containsKey(inter.start)) {
				map.get(inter.start).add(inter);
			} else {
				List<Interval> node = new ArrayList<Interval>();
				node.add(inter);
				map.put(inter.start, node);
			}
		}
		intervals.clear();
		for (int i = min; i <= max; i++) {
			if (map.containsKey(i)) {
				for (Interval in : map.get(i)) {
					intervals.add(in);
				}
			}
		}
		list.add(intervals.get(0));
		for (int i = 1; i < intervals.size(); i++) {
			Interval last = list.get(list.size() - 1);
			if (last.end < intervals.get(i).start) {
				list.add(intervals.get(i));
			} else {
				last.end = last.end > intervals.get(i).end ? last.end
						: intervals.get(i).end;
			}
		}
		return list;
	}

 

 

你可能感兴趣的:(LeetCode)