How to merge overlapping ranges (start,end),(start,end) in Swift

1 Answer

0 votes
import Foundation

struct RangePair {
    var start: Int
    var end: Int
}

func mergeRanges(_ ranges: [RangePair]) -> [RangePair] {
    let sorted = ranges.sorted { $0.start < $1.start }
    var merged: [RangePair] = []

    for range in sorted {
        if let last = merged.last, range.start <= last.end {
            merged[merged.count - 1].end = max(last.end, range.end)
        } else {
            merged.append(range)
        }
    }

    return merged
}

func main() {
    let ranges = [
        RangePair(start: 302, end: 447),
        RangePair(start: 488, end: 489),
        RangePair(start: 121, end: 234),
        RangePair(start: 200, end: 421),
        RangePair(start: 140, end: 354)
    ]

    let merged = mergeRanges(ranges)
    print(merged.map { "(\($0.start), \($0.end))" })
}

main()


/*
run:

["(121, 447)", "(488, 489)"]

*/

 



answered Jan 26 by avibootz
...