leetcode 56. 合併區間 golang實現

描述
給出一個區間的集合,請合併所有重疊的區間。

示例 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] 可被視爲重疊區間。
思路
先將區間按照 start 進行排序
遍歷每個區間, 開始向後遍歷 是否區間滿足合併的條件
初始
left := intervals[i][0]
right := intervals[i][1]

從j = i + 1開始
判斷後面j區間的開始intervals[j][0]是否<=right 是 則可以合併 切新區間的left=left right = max(right, intervals[j][1])

實現
type MergeSlice [][]int

func (s MergeSlice) Len() int           { return len(s) }
func (s MergeSlice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
func (s MergeSlice) Less(i, j int) bool { return s[i][0] < s[j][0] }

func merge(intervals [][]int) [][]int {
	sort.Sort(MergeSlice(intervals))
	retList := make([][]int, 0)
	size := len(intervals)

	var i int
	for i < size {
		left := intervals[i][0]
		right := intervals[i][1]
		j := i + 1
		for j < size {
			if intervals[j][0] <= right {
				right = Max(intervals[j][1], right)
				j++
			} else {
				break
			}
		}

		ret := []int{left, right}
		retList = append(retList, ret)
		i = j       // 合併之後i=j+1 沒有合併i=i+1 都可以用i=j表示
	}

	return retList
}

func Max(a, b int) int {
	if a >= b {
		return a
	} else {
		return b
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章