这是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
欢迎补充指正.