Skip to content
Related Articles

Related Articles

Find the missing elements from 1 to M in given N ranges
  • Last Updated : 02 Mar, 2021

Given N segments as ranges [L, R] where ranges are non-intersecting and non-overlapping. The task is to find all number between 1 to M that doesn’t belong to any of the given ranges.

Examples:  

Input : N = 2, M = 6
        Ranges:
        [1, 2]
        [4, 5]
Output : 3, 6
Explanation: Only 3 and 6 are missing from
the above ranges.

Input : N = 1, M = 5
        Ranges:
        [2, 4]
Output : 1, 5

Approach: Given that we have N ranges, which are non-overlapping and non-intersecting. First of all, sort all segments based on starting value. After sorting, iterate from each segment and find the numbers which are missing.

Below is the implementation of the above approach: 

C++




// C++ program to find mssing elements
// from given Ranges
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find mssing elements
// from given Ranges
void findMissingNumber(vector<pair<int, int> > ranges, int m)
{
    // First of all sort all the given ranges
    sort(ranges.begin(), ranges.end());
 
    // store ans in a different vector
    vector<int> ans;
 
    // prev is use to store end of
    // last range
    int prev = 0;
 
    // j is used as a counter for ranges
    for (int j = 0; j < ranges.size(); j++) {
        int start = ranges[j].first;
        int end = ranges[j].second;
 
        for (int i = prev + 1; i < start; i++)
            ans.push_back(i);
 
        prev = end;
    }
 
    // for last segment
    for (int i = prev + 1; i <= m; i++)
        ans.push_back(i);
 
    // finally print all answer
    for (int i = 0; i < ans.size(); i++) {
        if (ans[i] <= m)
            cout << ans[i] << " ";
    }
}
 
// Driver code
int main()
{
    int N = 2, M = 6;
 
    // Store ranges in vector of pair
    vector<pair<int, int> > ranges;
    ranges.push_back({ 1, 2 });
    ranges.push_back({ 4, 5 });
 
    findMissingNumber(ranges, M);
 
    return 0;
}

Java




// Java program to find missing elements
// from given Ranges
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
 
class GFG{
 
static class Pair
{
    int first, second;
     
    public Pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
// Function to find mssing elements
// from given Ranges
static void findMissingNumber(ArrayList<Pair> ranges,
                              int m)
{
     
    // First of all sort all the given ranges
    Collections.sort(ranges, new Comparator<Pair>()
    {
        public int compare(Pair first, Pair second)
        {
            if (first.first == second.first)
            {
                return first.second - second.second;
            }
            return first.first - second.first;
        }
    });
 
    // Store ans in a different vector
    ArrayList<Integer> ans = new ArrayList<>();
     
    // prev is use to store end of
    // last range
    int prev = 0;
     
    // j is used as a counter for ranges
    for(int j = 0; j < ranges.size(); j++)
    {
        int start = ranges.get(j).first;
        int end = ranges.get(j).second;
         
        for(int i = prev + 1; i < start; i++)
            ans.add(i);
             
        prev = end;
    }
     
    // For last segment
    for(int i = prev + 1; i <= m; i++)
        ans.add(i);
 
    // Finally print all answer
    for(int i = 0; i < ans.size(); i++)
    {
        if (ans.get(i) <= m)
            System.out.print(ans.get(i) + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
    int N = 2, M = 6;
     
    // Store ranges in vector of pair
    ArrayList<Pair> ranges = new ArrayList<>();
    ranges.add(new Pair(1, 2));
    ranges.add(new Pair(4, 5));
 
    findMissingNumber(ranges, M);
}
}
 
// This code is contributed by sanjeev2552

Python3




# Python3 program to find missing
# elements from given Ranges
 
# Function to find mssing elements
# from given Ranges
def findMissingNumber(ranges, m):
 
    # First of all sort all the
    # given ranges
    ranges.sort()
 
    # store ans in a different vector
    ans = []
 
    # prev is use to store end
    # of last range
    prev = 0
 
    # j is used as a counter for ranges
    for j in range(len(ranges)):
        start = ranges[j][0]
        end = ranges[j][1]
 
        for i in range(prev + 1, start):
            ans.append(i)
 
        prev = end
 
    # for last segment
    for i in range(prev + 1, m + 1):
        ans.append(i)
 
    # finally print all answer
    for i in range(len(ans)):
        if ans[i] <= m:
            print(ans[i], end = " ")
     
# Driver Code
if __name__ == "__main__":
     
    N, M = 2, 6
 
    # Store ranges in vector of pair
    ranges = []
    ranges.append([1, 2])
    ranges.append([4, 5])
 
    findMissingNumber(ranges, M)
 
# This code is contributed
# by Rituraj Jain

C#




// C# program to find missing elements
// from given Ranges
using System;
using System.Collections;
using System.Collections.Generic;
 
class GFG{
        
class sortHelper : IComparer
{
   int IComparer.Compare(object a, object b)
   {
      Pair first = (Pair)a;
      Pair second = (Pair)b;
      if (first.first == second.first)
      {
        return first.second - second.second;
      }
         
      return first.first - second.first;
   }
}
 
public class Pair
{
    public int first, second;
     
    public Pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
     
// Function to find mssing elements
// from given Ranges
static void findMissingNumber(ArrayList ranges, int m)
{
    IComparer myComparer = new sortHelper();
    ranges.Sort(myComparer);
     
    // Store ans in a different vector
    ArrayList ans = new ArrayList();
     
    // prev is use to store end of
    // last range
    int prev = 0;
     
    // j is used as a counter for ranges
    for(int j = 0; j < ranges.Count; j++)
    {
        int start = ((Pair)ranges[j]).first;
        int end = ((Pair)ranges[j]).second;
         
        for(int i = prev + 1; i < start; i++)
            ans.Add(i);
             
        prev = end;
    }
     
    // For last segment
    for(int i = prev + 1; i <= m; i++)
        ans.Add(i);
 
    // Finally print all answer
    for(int i = 0; i < ans.Count; i++)
    {
        if ((int)ans[i] <= m)
            Console.Write(ans[i] + " ");
    }
}
 
// Driver code
public static void Main(string[] args)
{
    int  M = 6;
     
    // Store ranges in vector of pair
    ArrayList ranges = new ArrayList();
    ranges.Add(new Pair(1, 2));
    ranges.Add(new Pair(4, 5));
 
    findMissingNumber(ranges, M);
}
}
 
// This code is contributed by rutvik_56

PHP




<?php
// PHP program to find missing
// elements from given Ranges
 
// Function to find mssing elements
// from given Ranges
function findMissingNumber($ranges, $m)
{
    // First of all sort all the
    // given ranges
    sort($ranges);
     
    // store ans in a different vector
    $ans = [];
     
    // prev is use to store end
    // of last range
    $prev = 0;
     
    // j is used as a counter for ranges
    for ($j = 0; $j < count($ranges); $j++)
    {
        $start = $ranges[$j][0];
        $end = $ranges[$j][1];
     
        for ($i = $prev + 1; $i < $start; $i++)
            array_push($ans, $i);
             
        $prev = $end;
    }
     
    // for last segment
    for ($i = $prev + 1; $i < $m + 1; $i++)
            array_push($ans, $i);
     
    // finally print all answer
    for ($i = 0; $i < count($ans); $i++)
    {
        if ($ans[$i] <= $m)
            echo "$ans[$i] ";
    }
}
 
// Driver Code
$N = 2;
$M = 6;
 
// Store ranges in vector of pair
$ranges = [];
array_push($ranges, [1, 2]);
array_push($ranges, [4, 5]);
 
findMissingNumber($ranges, $M)
 
// This code is contributed
// by Srathore
?>

Time Complexity: O(n * log(n)), where n is the length of the vector

Auxiliary Space: O(n)

competitive-programming-img




My Personal Notes arrow_drop_up
Recommended Articles
Page :