Find the missing elements from 1 to M in given N ranges
Last Updated :
25 Feb, 2023
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.
Algorithm:
Step 1: Start
Step 2: Create a class called Pair and make a constructor which takes two integer values as parameters.
Step 3: Create a static function that takes two parameters as input one in ArrayList of type Pair and the second an integer value.
Step 4: Now sort the given ArrayList using the collections sort method and use a comparator if two values are equal then will sort on the basis of the ending point.
Step 5: Now create an ArrayList called ans to store our answer
Step 6: Initialize a prev variable’s value to 0, Using a for-loop iterate across each range, saying for each range: first Create start and end variables from the place where it begins and ends.
, second Using a for-loop to iterate over all integers between prev and start, determine whether any elements are missing, and add those that are to the ans ArrayList, third Change prev to end.
Step 7: Start a for-loop, and iterate through each number between prev and m to see if there are any missing elements. If there are, add each one to the ans ArrayList.
Lastly, output any values that are less than or equal to m after iterating through the ans ArrayList.
Step 8: End
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findMissingNumber(vector<pair< int , int > > ranges, int m)
{
sort(ranges.begin(), ranges.end());
vector< int > ans;
int prev = 0;
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 ( int i = prev + 1; i <= m; i++)
ans.push_back(i);
for ( int i = 0; i < ans.size(); i++) {
if (ans[i] <= m)
cout << ans[i] << " " ;
}
}
int main()
{
int N = 2, M = 6;
vector<pair< int , int > > ranges;
ranges.push_back({ 1, 2 });
ranges.push_back({ 4, 5 });
findMissingNumber(ranges, M);
return 0;
}
|
Java
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;
}
}
static void findMissingNumber(ArrayList<Pair> ranges,
int m)
{
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;
}
});
ArrayList<Integer> ans = new ArrayList<>();
int prev = 0 ;
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 ( int i = prev + 1 ; i <= m; i++)
ans.add(i);
for ( int i = 0 ; i < ans.size(); i++)
{
if (ans.get(i) <= m)
System.out.print(ans.get(i) + " " );
}
}
public static void main(String[] args)
{
int N = 2 , M = 6 ;
ArrayList<Pair> ranges = new ArrayList<>();
ranges.add( new Pair( 1 , 2 ));
ranges.add( new Pair( 4 , 5 ));
findMissingNumber(ranges, M);
}
}
|
Python3
def findMissingNumber(ranges, m):
ranges.sort()
ans = []
prev = 0
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 i in range (prev + 1 , m + 1 ):
ans.append(i)
for i in range ( len (ans)):
if ans[i] < = m:
print (ans[i], end = " " )
if __name__ = = "__main__" :
N, M = 2 , 6
ranges = []
ranges.append([ 1 , 2 ])
ranges.append([ 4 , 5 ])
findMissingNumber(ranges, M)
|
C#
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;
}
}
static void findMissingNumber(ArrayList ranges, int m)
{
IComparer myComparer = new sortHelper();
ranges.Sort(myComparer);
ArrayList ans = new ArrayList();
int prev = 0;
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 ( int i = prev + 1; i <= m; i++)
ans.Add(i);
for ( int i = 0; i < ans.Count; i++)
{
if (( int )ans[i] <= m)
Console.Write(ans[i] + " " );
}
}
public static void Main( string [] args)
{
int M = 6;
ArrayList ranges = new ArrayList();
ranges.Add( new Pair(1, 2));
ranges.Add( new Pair(4, 5));
findMissingNumber(ranges, M);
}
}
|
PHP
<?php
function findMissingNumber( $ranges , $m )
{
sort( $ranges );
$ans = [];
$prev = 0;
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 ( $i = $prev + 1; $i < $m + 1; $i ++)
array_push ( $ans , $i );
for ( $i = 0; $i < count ( $ans ); $i ++)
{
if ( $ans [ $i ] <= $m )
echo "$ans[$i] " ;
}
}
$N = 2;
$M = 6;
$ranges = [];
array_push ( $ranges , [1, 2]);
array_push ( $ranges , [4, 5]);
findMissingNumber( $ranges , $M )
?>
|
Javascript
<script>
function findMissingNumber(ranges, m)
{
ranges.sort();
let ans=[];
let prev = 0;
for (let j = 0; j < ranges.length; j++) {
let start = ranges[j][0];
let end = ranges[j][1];
for (let i = prev + 1; i < start; i++)
ans.push(i);
prev = end;
}
for (let i = prev + 1; i <= m; i++)
ans.push(i);
for (let i = 0; i < ans.length; i++) {
if (ans[i] <= m)
document.write(ans[i], " " );
}
}
let N = 2;
let M = 6;
let ranges=[];
ranges.push([ 1, 2 ]);
ranges.push([ 4, 5 ]);
findMissingNumber(ranges, M);
</script>
|
Time Complexity: O(n * log(n)), where n is the length of the vector
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...