56. 合并区间

题目

Given a collection of intervals, merge all overlapping intervals. 给出一个区间的集合,请合并所有重叠的区间。

思路

说实话一脸懵逼,查了标签才知道先要排序,然后合并,合并逻辑很简单,当前闭区间小于开区间合并.关键go没排序,只能自己实现,一查发现快速排序还挺有意思.

代码

go

快速排序, 然而leetcode 不知道为啥不能用=- =

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func quickSort(arr [][]int, c chan bool) {
	pivot, left, right := 0, 0, len(arr)-1
	for i := left; i < right; i++ {
		if arr[i][0] <= arr[right][0] {
			arr[pivot], arr[i] = arr[i], arr[pivot]
			pivot++
		}
	}
	arr[right], arr[pivot] = arr[pivot], arr[right] // 把pivot移到它最後的地方

	if pivot+1 < right {
		go quickSort(arr[pivot+1:], c)
		<-c
	}

	if left < pivot-1 {
		go quickSort(arr[:pivot], c)
		<-c
	}

	c <- true
}

只能用实现interface的办法了=- =

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
type intss [][]int

func (s intss) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}

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

func (s intss) Len() int {
	return len(s)
}

最终代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func merge(intervals [][]int) [][]int {
	sort.Sort(intss(intervals))
	res := make([][]int, 0)

	for _, v := range intervals {
		if len(res) == 0 || res[len(res)-1][1] < v[0] {
			res = append(res, v)
		} else if v[1] > res[len(res)-1][1] {
			res[len(res)-1][1] = v[1]
		}
	}
	return res
}

type intss [][]int

func (s intss) Swap(i, j int) {
	s[i], s[j] = s[j], s[i]
}

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

func (s intss) Len() int {
	return len(s)
}

赏析