leetcode | 57. Insert Interval
阿新 • • 發佈:2018-12-09
題目
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
}