合并区间
思路一:
区间左边元素按顺序排列,从左到右依次合并
func merge(intervals [][]int) [][]int {
if len(intervals) == 1 {
return intervals
}
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
var result [][]int
curVal := intervals[0]
for i := 1; i < len(intervals); i++ {
if curVal[1] < intervals[i][0] {
result = append(result, curVal)
//更新curVal为下一组
curVal = intervals[i]
continue
}
//合并,注意这里区间右侧要取最大值
curVal = []int{curVal[0], max(curVal[1], intervals[i][1])}
}
//注意,最后要把curVal加入
result = append(result, curVal)
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
这题递归、回溯法好像无法发挥,没什么高级的办法
插入区间
思路:这题不要想的复杂了,在迭代的过程中,如果有重叠,不断更新重叠得到的新区间即可,直到不再重叠
func insert(intervals [][]int, newInterval []int) [][]int {
//边界条件
if len(intervals) == 0 {
return [][]int{newInterval}
}
//插入区间
var result [][]int
isAdded := false
for i := 0; i < len(intervals); i++ {
//把重叠区间加进去,加入重叠区间时有一种特殊情况,有可能算完重叠区间结束循环了,所以需要在外面将重叠区间加上去
if newInterval[1] < intervals[i][0] && !isAdded{
isAdded = true
result = append(result, newInterval)
}
//注意,把剩余的部分也得加进去
if intervals[i][1] < newInterval[0] || intervals[i][0] > newInterval[1] {
//不重叠,添加
result = append(result, intervals[i])
} else {
//重叠,更新区间范围
newInterval = []int{min(intervals[i][0], newInterval[0]), max(intervals[i][1], newInterval[1])}
}
}
if !isAdded {
result = append(result, newInterval)
}
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}