合并Go中重叠区间的教程

319 阅读1分钟

概述

给出一个区间数组,每个区间有一个开始时间和结束时间,合并重叠的区间。如果第一个区间的结束时间大于第二个区间的开始时间,则称两个区间为重叠。这是假设两个区间都是按开始时间排序的。

例子:

假设我们有以下两个区间

[2,6]
[5,8]

那么这些区间是重叠的,因为第一个区间的结束时间大于第二个区间的开始时间。 在这里,上述区间也是按开始时间排序的。

同样,下面两个区间也不重叠。

[2,6]
[8,9]

因此,目标是在给定的区间数组中合并重叠的区间。

例子:

Input: [[1,4], [8,10], [9,12], [3,5]]
Output: [[1,5], [8,12]]

程序

下面的逻辑是

  • 根据开始时间对区间阵列进行排序。

  • 从索引0开始,合并重叠的区间。如上所述,如果第一个区间的结束时间大于第二个区间的开始时间,则两个区间被称为重叠。

package main

import (
	"fmt"
	"sort"
)

func main() {
	output := merge([][]int{{1, 4}, {8, 10}, {9, 12}, {3, 5}})
	fmt.Println(output)

	output = merge([][]int{{1, 4}, {4, 5}})
	fmt.Println(output)

	output = merge([][]int{{2, 2}, {2, 2}})
	fmt.Println(output)

	output = merge([][]int{{2, 3}, {4, 5}, {6, 7}, {8, 9}, {1, 10}})
	fmt.Println(output)
}

type intervalsArray [][]int

func (intA intervalsArray) Len() int {
	return len(intA)
}

func (intA intervalsArray) Swap(i, j int) {
	intA[i], intA[j] = intA[j], intA[i]
}

func (intA intervalsArray) Less(i, j int) bool {
	return intA[i][0] < intA[j][0]
}

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

	intA := intervalsArray(intervals)

	sort.Sort(intA)

	intervalsSorted := [][]int(intA)
	//fmt.Println(intervalsSorted)

	var output [][]int
	currentIntervalStart := intervalsSorted[0][0]
	currentIntervalEnd := intervalsSorted[0][1]
	for j := 1; j < len(intervalsSorted); j++ {
		if currentIntervalEnd >= intervalsSorted[j][0] {
			if intervalsSorted[j][1] > currentIntervalEnd {
				currentIntervalEnd = intervalsSorted[j][1]
			}
		} else {
			output = append(output, []int{currentIntervalStart, currentIntervalEnd})
			currentIntervalStart = intervalsSorted[j][0]
			currentIntervalEnd = intervalsSorted[j][1]
		}
	}
	output = append(output, []int{currentIntervalStart, currentIntervalEnd})
	return output

}

输出

[[1 5] [8 12]]
[[1 5]]
[[2 2]]
[[1 10]]