合并区间

Problem: 56. 合并区间

思路

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
}
posted @ 2024-06-11 16:00  烟熏咸鱼干  阅读(3)  评论(0编辑  收藏  举报