合并区间56

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路:

  1. 怎么判断重叠: 两区间的最小的右边界 大于或等于 两区间最大的左边界. 如[1,5][2,8]
  2. 入参是切片的切片(intervals), 拿intervals[0]与它后面的所有区间对比, 从intervals[1]开始, 如果有与之重叠的区间, 就把合并后的新区间赋给intervals[0], 并删除参与合并的那个旧区间
  3. intervals[0]完成后, 拿``intervals[1]与它后边的所有区间对比, 从intervals[2] 开始, 如果有与之重叠的区间, 就把合并后的新区间赋给intervals[1]`, 并删除参与合并的那个就区间
  4. intervals[i] 与它后边的所有区间对比, 从intervals[i+1] 开始, 如果有与之重叠的区间intervals[j] , 就把合并后的新区间赋给 intervals[i] , 并删除参与合并的intervals[j]
  5. 如果第3步出现了有重叠的区间intervals[j], 那么合并后i 的值变了, 就有可能由原来 在ij 之间没有重叠的区间 变成 有重叠的区间, 所以需要从头(i+1) 再遍历一次, 直到再也没有重叠的区间
  6. 重复, 一直到切片末尾

code

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func merge(intervals [][]int) [][]int {

	for i := 0; i < len(intervals); {
		merged := false
		for j := i + 1; j < len(intervals); j++ {
			x, y := intervals[i], intervals[j]
			
			if min(x[1], y[1]) >= max(x[0], y[0]) {
				merged = true
				//重新赋值
				intervals[i][0], intervals[i][1] = min(x[0], y[0]), max(x[1], y[1])
				
				//删除j
				intervals[j] = intervals[len(intervals) - 1]
				intervals = intervals[:len(intervals) - 1]
			}
		}
		
		if merged {
			continue
		}
		i++
	}
	
	return intervals
}
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计