申明:本文只用做自己的学习记录
题目
一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]
代码
func insert(intervals [][]int, newInterval []int) [][]int {
//创建空数组存放结果
results := [][]int{}
//判断边界条件,特殊情况3种
//第一种情况:intervals为空,newInterval有一个区间
//第二种情况:intervals有一个元素,newInterval为空
//第三种情况:intervals为空,newInterval为空
if len(intervals) == 0 && len(newInterval) == 1 || len(intervals) == 1 && len(newInterval) == 0 {
if len(intervals) == 1 {
return intervals
} else {
results = append(intervals, newInterval)
return results
}
return intervals
} else if len(intervals) == 0 && len(newInterval) == 0 {
return results
}
start, end := newInterval[0], newInterval[1]
leftlist, rightlist := [][]int{}, [][]int{}
for i := 0; i < len(intervals); i++ {
//将区间没有交集的较小的,存入左列表
if intervals[i][1] < start {
leftlist = append(leftlist, intervals[i])
//将区间没有交集的较大的,存入右列表
} else if end < intervals[i][0] {
rightlist = append(rightlist, intervals[i])
//有交集的融合区间
} else {
start = Min(start, intervals[i][0])
end = Max(end, intervals[i][1])
}
}
//拼凑区间
results = append(results, leftlist...)
results = append(results, []int{start, end})
results = append(results, rightlist...)
return results
}
func Min(a, b int) int {
if a > b {
return b
} else {
return a
}
}
func Max(a, b int) int {
if a > b {
return a
} else {
return b
}
}