Skip to content

Instantly share code, notes, and snippets.

@Devligue
Last active July 3, 2018 23:18
Show Gist options
  • Save Devligue/1533fd701bab4468dde0a3f8dab06c51 to your computer and use it in GitHub Desktop.
Save Devligue/1533fd701bab4468dde0a3f8dab06c51 to your computer and use it in GitHub Desktop.
INTERVIEW: Given a list of intervals, write function that will merge the overlapping intervals and return new list. 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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment