Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
package main
import(
"sort"
"fmt"
)
type Interval struct {
Start int
End int
}
type list []Interval
func (I list) Len() int{
return len(I)
}
func (I list) Less(i, j int) bool{
return I[i].Start < I[j].Start
}
func (I list) Swap(i, j int){
I[i], I[j] = I[j], I[i]
}
func merge(intervals []Interval) []Interval {
var result []Interval
sort.Sort(list(intervals))
curr := 0
for i:=1; i<len(intervals); {
if intervals[i].Start <= intervals[curr].End{
var temp Interval
temp.Start = intervals[curr].Start
if intervals[i].End >= intervals[curr].End{
temp.End = intervals[i].End
}else{
temp.End = intervals[curr].End
}
intervals[curr] = temp
intervals = append(intervals[:curr+1],intervals[i+1:len(intervals)]...)
}else{
curr++
i++
}
}
result = intervals
return result
}
func main(){
var intervals []Interval
intervals = append(intervals, Interval{1,4}, Interval{0,2}, Interval{3, 5})
result := merge(intervals)
fmt.Println(result)
}
另一种方法
package main
import(
"sort"
"fmt"
)
type Interval struct {
Start int
End int
}
type list []Interval
func (I list) Len() int{
return len(I)
}
func (I list) Less(i, j int) bool{
return I[i].Start < I[j].Start
}
func (I list) Swap(i, j int){
I[i], I[j] = I[j], I[i]
}
func merge(intervals []Interval) []Interval {
sort.Sort(list(intervals))
var result []Interval
for _, v := range intervals{
if(len(result)==0 || result[len(result)-1].End<v.Start){
result = append(result, v)
}else{
if result[len(result)-1].End < v.End{
result[len(result)-1].End = v.End
}
}
}
return result
}
func main(){
var intervals []Interval
intervals = append(intervals, Interval{1,4}, Interval{0,2}, Interval{3, 5})
result := merge(intervals)
fmt.Println(result)
}