How to add a new interval into a sorted list of non‑overlapping intervals in Scala

1 Answer

0 votes
object InsertIntervalProgram {

  def insertInterval(intervals: List[(Int, Int)], newInterval: (Int, Int)): List[(Int, Int)] = {
    var result = List.empty[(Int, Int)]
    var i = 0
    val n = intervals.length
    var current = newInterval

    // 1. Add all intervals that end BEFORE the new interval starts.
    // These cannot overlap.
    while (i < n && intervals(i)._2 < current._1) {
      result = result :+ intervals(i)
      i += 1
    }

    // 2. Merge all intervals that DO overlap with the new interval.
    // Overlap condition: intervals(i).start <= newInterval.end
    while (i < n && intervals(i)._1 <= current._2) {
      current = (
        math.min(current._1, intervals(i)._1),
        math.max(current._2, intervals(i)._2)
      )
      i += 1
    }

    // Add the merged interval
    result = result :+ current

    // 3. Add all remaining intervals (those starting AFTER new interval ends)
    while (i < n) {
      result = result :+ intervals(i)
      i += 1
    }

    result
  }

  def main(args: Array[String]): Unit = {
    val intervals = List((1, 3), (6, 8), (13, 18))
    val newInterval1 = (9, 11)

    val updated1 = insertInterval(intervals, newInterval1)

    val newInterval2 = (2, 5)
    val updated2 = insertInterval(updated1, newInterval2)

    println("Updated intervals:")
    updated2.foreach { case (s, e) => print(s"[$s,$e] ") }
  }
}


/*
run:

Updated intervals:
[1,5] [6,8] [9,11] [13,18] 

*/

 



answered Apr 9 by avibootz

Related questions

...