Solving the merge intervals problem in golang(link: https://leetcode.com/problems/merge-intervals/).
The Problem
Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
Example 1:
Input: intervals = [[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: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
Code
package main
import (
"fmt"
"sort"
)
func main() {
var intervals [][]int
intervals = append(intervals, []int{7, 10})
intervals = append(intervals, []int{3, 4})
intervals = append(intervals, []int{2, 5})
mergeIntervals(intervals)
}
func mergeIntervals(intervals [][]int) [][]int {
if len(intervals) < 2{
return intervals
}
var mergedIntervals [][]int
fmt.Println("intervals :", intervals)
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
previousEndTime := intervals[0][1]
for index, _ := range intervals {
if index >= len(intervals)-1 {
if index == len(intervals)-1 {
mergedIntervals = append(mergedIntervals, []int{intervals[index][0], intervals[index][1]})
}
break
}
if index != 0 {
//skip current interval if previous interval end time is higher
if previousEndTime > intervals[index][1] {
continue
}
}
fmt.Println("comparing intervals ", intervals[index], "and ", intervals[index+1])
if intervals[index][1] > intervals[index+1][1] {
//check if current end time greater than end time of next interval
mergedIntervals = append(mergedIntervals, []int{intervals[index][0], intervals[index][1]})
previousEndTime = intervals[index][1]
} else if intervals[index][1] >= intervals[index+1][0] {
//the actual merge for overlapping values
mergedIntervals = append(mergedIntervals, []int{intervals[index][0], intervals[index+1][1]})
previousEndTime = intervals[index+1][1]
} else {
//just include current interval with no overlap
mergedIntervals = append(mergedIntervals, []int{intervals[index][0], intervals[index][1]})
previousEndTime = intervals[index][1]
}
}
fmt.Println("merged intervals ", mergedIntervals)
return mergedIntervals
}
Looking for
- Code Bugs.
- Feel this code is too verbose.Any suggestions on how to optimize the code further.