本题思路
- 先依据每个区间的开始值从小到大排序
- 再利用双指针从左向右尝试合并区间
牛客题目的解法如下
import "sort"
/*
* type Interval struct {
* Start int
* End int
* }
*/
/**
*
* @param intervals Interval类一维数组
* @return Interval类一维数组
*/
func merge( intervals []*Interval ) []*Interval {
// write code here
l := len(intervals)
if l < 2 {
return intervals
}
sort.Sort(Intervals(intervals))
// i,j 双指针
// i和j 将intervals划分为如下几个部分
// [0, i] 已合并完成
// [i+1, j) 无效数据,可以被覆盖
// [j, l) 待处理数据
var i int
for j := 1; j < l; j++ {
a := intervals[i]
b := intervals[j]
if shouldMerge(a, b) {
intervals[i] = mergeTwo(a, b) // 复用内存
} else {
i++
if i != j { // 避免不必要的复制
intervals[i] = b // 复用内存
}
}
}
return intervals[:i+1]
}
// 判断两个区间是否需要合并
// 返回值:true-需要合并
func shouldMerge(a, b *Interval) bool {
if a.End < b.Start {
return false
}
return true
}
// 合并两个区间
// 返回值:合并后的区间
func mergeTwo(a, b *Interval) *Interval {
var end int
if a.End > b.End {
end = a.End
} else {
end = b.End
}
return &Interval{Start:a.Start, End:end}
}
// 排序需要的
type Intervals []*Interval
func (o Intervals) Len() int {
return len(o)
}
func (o Intervals) Swap(i, j int) {
o[i], o[j] = o[j], o[i]
}
func (o Intervals) Less(i, j int) bool {
return o[i].Start < o[j].Start
}
力扣的题目基本一致,只不过输入参数和返回值是[][]int,读者可根据牛客题目解法自行修改。