区间合并问题(merge-intervals)

这是leetcode上的一道题目,
原题目表述如下:
给定一组区间,合并所有有重叠的区间.

例子1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
解释: 由于[1,3] 和 [2,6] 有重叠区域, 合并为 [1,6].

例子2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间.

原题目给的一个区间的结构定义如下:

type Interval struct {
	Start int
	End   int
}

实现如下:

func mergeInterval(intervals []Interval) []Interval {
	var starts []int
	var ends []int
	var results []Interval
	n := len(intervals)

	for i := 0; i < n; i++ {
		starts = append(starts, intervals[i].Start)
		ends = append(ends, intervals[i].End)
	}

	sort.Ints(starts)
	sort.Ints(ends)

	i := 0
	j := 0

	// 经过排序之后,starts相对ends一定是“整体偏小”的
	// 可能有如下两种情况
	// 情况1,有“交集”
	// starts: ●    ●       ●
	//   ends:	  ●      ●     ●
	// 情况2,无“交集”
	// starts: ●    ●       ●
	//   ends:	               ●      ●     ●
	for ; i < n; i++ {
		// 最后一个start 或者 当有“交集”的时候
		if i+1 == n || starts[i+1] > ends[i] {
			results = append(results, Interval{starts[j], ends[i]})
			j = i + 1
		}
	}

	return results
}

思路如下:
首先按输入的intervals分别生成starts和ends, 然后将starts和ends排序.
这样, 就剩下两种可能了(点在横向的相对位置表示其大小,可以想像成数轴):

情况1,有“交集”
starts: ●    ●       ●
  ends:    ●      ●     ●
情况2,无“交集”
starts: ●    ●       ●
  ends:                 ●      ●     ●

那么重叠的部分其实就是: starts[i+1] > ends[i]. 具体请看代码(结合上面的图看好想一些).

参考:
https://blog.csdn.net/ustcyy91/article/details/81669176

欢迎补充指正.

你可能感兴趣的:(算法,Golang,golang学习笔记)