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
}