合併區間

烟熏咸鱼干發表於2024-06-11

Problem: 56. 合併區間

目錄
  • 思路
  • 解題方法
  • 複雜度
  • Code1 這個寫的有點不優美了 醜
  • Code2

思路

bite陣列與排序兩種思路

解題方法

描述你的解題方法

複雜度

時間複雜度:

新增時間複雜度, 示例: $O(n)$

空間複雜度:

新增空間複雜度, 示例: $O(n)$

Code1 這個寫的有點不優美了 醜

func merge(intervals [][]int) [][]int {
	result := [][]int{}
	// false, 由於[[1,4],[5,6]]要求返回[[1,4],[5,6]]而不是[1,6], 故bool陣列翻倍使用<<1
	boolArray := make([]bool, (10*10*10*10+1)<<1)
	// minNumber, maxNumber := math.MaxInt, math.MinInt
	// 將範圍內的bool改成true
	for _, i := range intervals {
		// if i[0] < minNumber {
		// 	minNumber = i[0]
		// }
		// if i[0] > maxNumber {
		// 	maxNumber = i[0]
		// }
		for index := i[0]; index <= i[1]; index++ {
			// 如果是i[0], 就不需要與前面連線
			if index == i[0] {
				boolArray[index<<1] = true
			} else {
				boolArray[index<<1-1], boolArray[index<<1] = true, true
			}
		}
	}
	// 返回結果
	for i := 0; i < len(boolArray); i++ {
		// 當遇到true時
		if boolArray[i] {
			// 找到下一個i不為true的
			j := 1
			for boolArray[i+j] && j < len(boolArray)-i {
				j++
			}
			result = append(result, []int{i >> 1, (i + j - 1) >> 1})
			i = i + j - 1
		}
	}
	return result
}

Code2

func merge(intervals [][]int) [][]int {
	result := [][]int{}
	// 排序
	sort.Slice(intervals, func(i, j int) bool {
		return intervals[i][0] < intervals[j][0]
	})

	for _, interval := range intervals {
		// 第一次或者與前面的區間不重合
		if len(result) == 0 || interval[0] > result[len(result)-1][1] {
			result = append(result, interval)
		} else {
			if result[len(result)-1][1] < interval[1] {
				result[len(result)-1][1] = interval[1]
			}
		}
	}
	return result
}

相關文章