Given a collection of intervals, merge all overlapping intervals.
For example, given [1,3],[8,10],[2,6],[15,18] return [1,6],[8,10],[15,18].
Given a collection of intervals, merge all overlapping intervals.
For example, given [1,3],[8,10],[2,6],[15,18] return [1,6],[8,10],[15,18].
| package main | |
| import ( | |
| "fmt" | |
| "math" | |
| "sort" | |
| ) | |
| type Interval struct { | |
| Lower int | |
| Upper int | |
| } | |
| func (i *Interval) SetUpper(new int) { | |
| i.Upper = new | |
| } | |
| func mergeOverlapping(intervals []Interval) []Interval { | |
| sort.Slice(intervals[:], func(j, k int) bool { | |
| return intervals[j].Lower < intervals[k].Lower | |
| }) | |
| var merged []Interval | |
| for _, current := range intervals { | |
| if len(merged) == 0 { | |
| merged = append(merged, current) | |
| } else { | |
| previous := merged[len(merged)-1] | |
| if previous.Upper >= current.Lower { | |
| merged[len(merged)-1].SetUpper( | |
| int( | |
| math.Max( | |
| float64(previous.Upper), | |
| float64(current.Upper), | |
| ), | |
| ), | |
| ) | |
| } else { | |
| merged = append(merged, current) | |
| } | |
| } | |
| } | |
| return merged | |
| } | |
| func main() { | |
| intervals := []Interval{{3, 5}, {7, 10}, {4, 8}, {12, 15}, {16, 19}} | |
| merged := mergeOverlapping(intervals) | |
| fmt.Println(merged) | |
| } |
| intervals = [[1,3],[8,10],[2,6],[15,18]] | |
| def merge_overlapping(intervals): | |
| intervals.sort(key=lambda interval: interval[0]) | |
| merged = list() | |
| for interval in intervals: | |
| if not merged: | |
| merged.append(interval) | |
| else: | |
| previous = merged[-1] | |
| if previous[1] >= interval[0]: | |
| merged[-1] = [previous[0], max(previous[1], interval[1])] | |
| else: | |
| merged.append(interval) | |
| return merged | |
| print(merge_overlapping(intervals)) |