题目
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.
Example 1:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
思路与解法
intervals
列表中的区间interval
与newInterval
有三种不同情况:①inteval
在左,且两者不相交;②两者相交;③interval
在右,且两者不相交。
当处于第①种情况时,直接将interval
加入到结果列表中即可;
当处于第②中情况时,更新newInterval
的左端点和右端点;
当处于第③种情况时,将interval
加入到结果列表中。
代码实现(GO)
/**
* Definition for an interval.
* type Interval struct {
* Start int
* End int
* }
*/
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func insert(intervals []Interval, newInterval Interval) []Interval {
intervals_merged := make([]Interval, 0)
flag := false
var i int
var interval Interval
// 遍历整个intervals区间
for i, interval = range intervals {
// 当interval右端点 < newInterval左端点,说明两者无交集,即可将interval加入到intervals_merged中
if interval.End < newInterval.Start {
intervals_merged = append(intervals_merged, interval)
} else if interval.Start > newInterval.End {
// 当interval左端点 > newInterval右端点,说明两者无交集,且newInterval不会再次更新,即可将newInterval加入到intervals_merged中
flag = true
intervals_merged = append(intervals_merged, newInterval)
break
} else {
// 若interval和newInterval有交集,则更新newInterval
newInterval.Start = min(interval.Start, newInterval.Start)
newInterval.End = max(interval.End, newInterval.End)
}
}
// flag == true,说明已经将newInterval加入到intervals_merged中,之后再将intervals[i:]加入即可
if flag == true {
intervals_merged = append(intervals_merged, intervals[i:]...)
} else {
// flag == false,说明没有将newInterval加入到intervals_merged,intervals中没有并未遍历过的区间
intervals_merged = append(intervals_merged, newInterval)
}
return intervals_merged
}