Insert IntervalInsert and Merge IntervalInsert Interval

Spread the love

A new interval we add could intersect some adjacent intervals in the array. Given the already sorted interval array, one can find overlapping intervals in a contiguous subarray. We identify overlapping interval’s subarray and combine them with new interval to generate a single merged interval.

We first add the lower intervals, then this merged interval, and lastly the remaining intervals in the output to preserve the order ordered.

C++

// C++ program to insert a new Interval in an array of sorted and 
// non-overlapping interval using Contiguous Interval Merging

#include <iostream>
#include <vector>
using namespace std;

// Function to insert and merge intervals
vector<vector<int>> insertInterval(vector<vector<int>>& intervals,
                                   vector<int> &newInterval) {
    vector<vector<int>> res;
    int i = 0;
    int n = intervals.size();

    // Add all intervals that come before the new interval
    while (i < n && intervals[i][1] < newInterval[0]) {
        res.push_back(intervals[i]);
        i++;
    }

    // Merge all overlapping intervals with the new interval
    while (i < n && intervals[i][0] <= newInterval[1]) {
        newInterval[0] = min(newInterval[0], intervals[i][0]);
        newInterval[1] = max(newInterval[1], intervals[i][1]);
        i++;
    }
    res.push_back(newInterval);

    // Add all the remaining intervals
    while (i < n) {
        res.push_back(intervals[i]);
        i++;
    }

    return res;
}

int main() {
    vector<vector<int>> intervals = {{1, 3}, {4, 5}, {6, 7}, {8, 10}};
    vector<int> newInterval = {5, 6};
    
    vector<vector<int>> res = insertInterval(intervals, newInterval);
      for (vector<int> interval: res) {
          cout << interval[0] << " " << interval[1] << "\n";
    }
    return 0;
}

Java

// Java program to insert a new Interval in an array of sorted and 
// non-overlapping interval using Contiguous Interval Merging

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class GfG {

    // Function to insert and merge intervals
    static ArrayList<int[]> insertInterval(int[][] intervals, int[] newInterval) {
        ArrayList<int[]> res = new ArrayList<>();
        int i = 0;
        int n = intervals.length;

        // Add all intervals that come before the new interval
        while (i < n && intervals[i][1] < newInterval[0]) {
            res.add(intervals[i]);
            i++;
        }

        // Merge all overlapping intervals with the new interval
        while (i < n && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
            newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
            i++;
        }
        res.add(newInterval);

        // Add all the remaining intervals
        while (i < n) {
            res.add(intervals[i]);
            i++;
        }

        // Return the result as a List<int[]>
        return res;
    }

    public static void main(String[] args) {
        int[][] intervals = {{1, 3}, {4, 5}, {6, 7}, {8, 10}};
        int[] newInterval = {5, 6};

        ArrayList<int[]> res = insertInterval(intervals, newInterval);
        for (int[] interval : res) {
            System.out.println(interval[0] + " " + interval[1]);
        }
    }
}

Python

# Python program to insert a new Interval in an array of sorted and 
# non-overlapping interval using Contiguous Interval Merging

# Function to insert and merge intervals
def insertInterval(intervals, newInterval):
    res = []
    i = 0
    n = len(intervals)

    # Add all intervals that come before the new interval
    while i < n and intervals[i][1] < newInterval[0]:
        res.append(intervals[i])
        i += 1

    # Merge all overlapping intervals with the new interval
    while i < n and intervals[i][0] <= newInterval[1]:
        newInterval[0] = min(newInterval[0], intervals[i][0])
        newInterval[1] = max(newInterval[1], intervals[i][1])
        i += 1
        
    res.append(newInterval)

    # Add all the remaining intervals
    while i < n:
        res.append(intervals[i])
        i += 1

    return res

if __name__ == "__main__":
    intervals =  [[1, 3], [4, 5], [6, 7], [8, 10]]
    newInterval = [5, 6]

    res = insertInterval(intervals, newInterval)
    for interval in res:
        print(interval[0], interval[1])

C#

// C# program to insert a new Interval in an array of sorted and 
// non-overlapping interval using Contiguous Interval Merging

using System;
using System.Collections.Generic;

class GfG {

    // Function to insert and merge intervals
    static List<int[]> insertInterval(int[][] intervals, int[] newInterval) {
        List<int[]> res = new List<int[]>();
        int i = 0;
        int n = intervals.Length;

        // Add all intervals that come before the new interval
        while (i < n && intervals[i][1] < newInterval[0]) {
            res.Add(intervals[i]);
            i++;
        }

        // Merge all overlapping intervals with the new interval
        while (i < n && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = Math.Min(newInterval[0], intervals[i][0]);
            newInterval[1] = Math.Max(newInterval[1], intervals[i][1]);
            i++;
        }
        res.Add(newInterval);

        // Add all the remaining intervals
        while (i < n) {
            res.Add(intervals[i]);
            i++;
        }

        // Return result as List<int[]>
        return res;
    }

    static void Main(string[] args) {
        int[][] intervals = new int[][] {
            new int[] {1, 3},
            new int[] {4, 5},
            new int[] {6, 7},
            new int[] {8, 10}
        };
        int[] newInterval = new int[] {5, 6};

        List<int[]> res = insertInterval(intervals, newInterval);
        foreach (int[] interval in res) {
            Console.WriteLine(interval[0] + " " + interval[1]);
        }
    }
}

JavaScript

// Javascript program to insert a new Interval in an array of sorted and 
// non-overlapping interval using Contiguous Interval Merging

function insertInterval(intervals, newInterval) {
    let res = [];
    let i = 0;
    const n = intervals.length;

    // Add all intervals that come before the new interval
    while (i < n && intervals[i][1] < newInterval[0]) {
        res.push(intervals[i]);
        i++;
    }

    // Merge all overlapping intervals with the new interval
    while (i < n && intervals[i][0] <= newInterval[1]) {
        newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
        newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
        i++;
    }
    res.push(newInterval);

    // Add all the remaining intervals
    while (i < n) {
        res.push(intervals[i]);
        i++;
    }

    return res;
}

// Driver Code
const intervals = [[1, 3], [4, 5], [6, 7], [8, 10]];
const newInterval = [5, 6];

const res = insertInterval(intervals, newInterval);
for (const interval of res) {
    console.log(interval[0] + " " + interval[1]);
};

Output

1 3
4 7
8 10