57. 插入区间

题目

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
You may assume that the intervals were initially sorted according to their start times.
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

思路

56题改一下,先插后合,还不用排序
然后我试了一下,中间有的元素不用管,纯插入
插入逻辑,如果当前值小于new值,或者数组最后还没插入,就插入

1
2
3
4
5
6
7
8
if !inserted && newInterval[0] <= intervals[i][0]  {
	intervals = append(intervals[:i+1], intervals[i:]...)
	intervals[i] = newInterval
	inserted = true
}
if !inserted && i == len(intervals)-1 {
	intervals = append(intervals, newInterval)
}

代码

go

 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 insert(intervals [][]int, newInterval []int) [][]int {
	res := make([][]int, 0)
	if len(intervals) == 0 {
		res = append(res, newInterval)
		return res
	}
	inserted := false
	for i := 0; i < len(intervals); i++ {
        last := len(res) - 1
        // 如果当前值小于new值,在当前值前插入new值
		if !inserted && newInterval[0] <= intervals[i][0]  {
			intervals = append(intervals[:i+1], intervals[i:]...)
			intervals[i] = newInterval
			inserted = true
        }
        // 如果数组最后还未插入,插入到数组末端
		if !inserted && i == len(intervals)-1 {
			intervals = append(intervals, newInterval)
		}
		if i == 0 || res[last][1] < intervals[i][0] {
			res = append(res, intervals[i])
		} else if intervals[i][1] > res[last][1] {
			res[last][1] = intervals[i][1]
		}
	}
	return res
}

inserted 作为标记,防止插多了