合并区间、插入区间

9 阅读1分钟

合并区间

思路一:

区间左边元素按顺序排列,从左到右依次合并

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
}