For each element in 1st array count elements less than or equal to it in 2nd array | Set 2
Last Updated :
02 Sep, 2022
Given two unsorted arrays arr1[] and arr2[]. They may contain duplicates. For each element in arr1[] count elements less than or equal to it in array arr2[].
Examples:
Input : arr1[] = [1, 2, 3, 4, 7, 9]
arr2[] = [0, 1, 2, 1, 1, 4]
Output : [4, 5, 5, 6, 6, 6]
Explanation: There are 4 elements less than or equal to 1 in second array, similarly there are 5 elements less than 2 in second array, calculate the values similarly for other elements.
Input : arr1[] = [5, 10, 2, 6, 1, 8, 6, 12]
arr2[] = [6, 5, 11, 4, 2, 3, 7]
Output : [4, 6, 1, 5, 0, 6, 5, 7]
Explanation: There are 4 elements less than or equal to 5 in second array, similarly there are 6 elements less than 10 in second array, calculate the values similarly for other elements.
This problem is already discussed in the previous post.
Solution: In this article, a more optimized linear time solution to the above problem is discussed. The approach discussed here works for arrays with values in a small range. A range of values that can be used as an index in an array.
Approach: The idea is to create a prefix map up to the maximum element of the second array. The prefix array will store the maximum element up to that index, for example, prefix[i] will store the count of elements up to i. Then traverse through the first array and find the count of elements less than or equal to that element from the prefix array.
The prefix array is created by traversing through the prefix array and updating the current element by adding the precious element, i.e. prefix[i]+ =prefix[i-1].
Algorithm:
- Create extra space (prefix) of the size of a maximum element of the second and first array or a map.
- Traverse the second array.
- For every element of the second array increase the count of prefix array, i.e. prefix[arr2[i]]++
- Traverse through the prefix array from 1 to MAX (maximum element of the second and first array and update the ith element by adding the sum of i-1th element
- Now traverse through the first array and print the value of prefix[arr_1[i]]
Implementation:
C++
#include <iostream>
using namespace std;
#define MAX 100000
void countEleLessThanOrEqual( int arr1[], int m,
int arr2[], int n)
{
int hash[MAX] = {0};
for ( int i = 0; i < n; i++)
hash[arr2[i]]++;
for ( int i=1; i<MAX; i++)
hash[i] = hash[i] + hash[i-1];
for ( int i = 0; i < m; i++)
cout << hash[arr1[i]] << " " ;
}
int main()
{
int arr1[] = {1, 2, 3, 4, 7, 9};
int arr2[] = {0, 1, 2, 1, 1, 4};
int m, n;
m = sizeof (arr1) / sizeof (arr1[0]);
n = sizeof (arr2) / sizeof (arr2[0]);
countEleLessThanOrEqual(arr1, m, arr2, n);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int MAX = 100000 ;
static void countEleLessThanOrEqual( int arr1[], int m,
int arr2[], int n)
{
int hash[] = new int [MAX];
for ( int i = 0 ; i < n; i++)
hash[arr2[i]]++;
for ( int i = 1 ; i < MAX; i++)
{
hash[i] = hash[i] +
hash[i - 1 ];
}
for ( int i = 0 ; i < m; i++)
{
System.out.print(hash[arr1[i]] + " " );
}
}
public static void main (String[] args)
{
int arr1[] = { 1 , 2 , 3 , 4 , 7 , 9 };
int arr2[] = { 0 , 1 , 2 , 1 , 1 , 4 };
int m, n;
m = arr1.length;
n = arr2.length;
countEleLessThanOrEqual(arr1, m, arr2, n);
}
}
|
Python3
MAX = 100000
def countEleLessThanOrEqual(arr1, m, arr2, n):
hash = [ 0 for i in range ( MAX )]
for i in range (n):
hash [arr2[i]] + = 1
for i in range ( 1 , MAX , 1 ):
hash [i] = hash [i] + hash [i - 1 ]
for i in range (m):
print ( hash [arr1[i]], end = " " )
if __name__ = = '__main__' :
arr1 = [ 1 , 2 , 3 , 4 , 7 , 9 ]
arr2 = [ 0 , 1 , 2 , 1 , 1 , 4 ]
m = len (arr1)
n = len (arr2)
countEleLessThanOrEqual(arr1, m, arr2, n)
|
C#
using System;
public class GFG {
static int MAX = 100000;
static void countEleLessThanOrEqual( int []arr1, int m,
int []arr2, int n)
{
int []hash = new int [MAX];
for ( int i = 0; i < n; i++)
hash[arr2[i]]++;
for ( int i = 1; i < MAX; i++)
{
hash[i] = hash[i] +
hash[i - 1];
}
for ( int i = 0; i < m; i++)
{
Console.Write(hash[arr1[i]] + " " );
}
}
public static void Main ()
{
int []arr1 = {1, 2, 3, 4, 7, 9};
int []arr2 = {0, 1, 2, 1, 1, 4};
int m, n;
m = arr1.Length;
n = arr2.Length;
countEleLessThanOrEqual(arr1, m, arr2, n);
}
}
|
PHP
<?php
$MAX = 100000 ;
function countEleLessThanOrEqual(& $arr1 , $m ,
& $arr2 , $n )
{
global $MAX ;
$hash = array_fill (0, $MAX , NULL);
for ( $i = 0; $i < $n ; $i ++)
$hash [ $arr2 [ $i ]]++;
for ( $i = 1; $i < $MAX ; $i ++)
$hash [ $i ] = $hash [ $i ] + $hash [ $i - 1];
for ( $i = 0; $i < $m ; $i ++)
echo $hash [ $arr1 [ $i ]] . " " ;
}
$arr1 = array (1, 2, 3, 4, 7, 9);
$arr2 = array (0, 1, 2, 1, 1, 4);
$m = sizeof( $arr1 );
$n = sizeof( $arr2 );
countEleLessThanOrEqual( $arr1 , $m , $arr2 , $n );
?>
|
Javascript
<script>
let MAX = 100000;
function countEleLessThanOrEqual(arr1,m,arr2,n)
{
let hash = new Array(MAX);
for (let i=0;i<hash.length;i++)
{
hash[i]=0;
}
for (let i = 0; i < n; i++)
hash[arr2[i]]++;
for (let i = 1; i < MAX; i++)
{
hash[i] = hash[i] +
hash[i - 1];
}
for (let i = 0; i < m; i++)
{
document.write(hash[arr1[i]] + " " );
}
}
let arr1=[1, 2, 3, 4, 7, 9];
let arr2=[0, 1, 2, 1, 1, 4];
let m, n;
m = arr1.length;
n = arr2.length;
countEleLessThanOrEqual(arr1, m, arr2, n);
</script>
|
Complexity Analysis:
- Time Complexity: O(max), where max is the maximum element of both arrays
- Auxiliary Space: O(max), where max is the maximum element of both arrays.
Implementation:
C++
#include <iostream>
#include <map>
#include <vector>
void countLessThanOrEqual( const std::vector< int >& vec1,
const std::vector< int >& vec2) {
std::map< int , unsigned int > countOfVec2;
for ( const auto & item : vec2) {
++countOfVec2[item];
}
unsigned int prev = 0;
for ( auto & pair : countOfVec2) {
pair.second += prev;
prev = pair.second;
}
for ( const auto & item : vec1) {
unsigned int result = (--countOfVec2.upper_bound(item))->second;
std::cout << result << " " ;
}
}
int main()
{
std::vector< int > arr1 = { 1, 2, 3, 4, 7, 9 };
std::vector< int > arr2 = { 0, 1, 2, 1, 1, 4 };
countLessThanOrEqual(arr1, arr2);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void countLessThanOrEqual( int vec1[], int vec2[])
{
HashMap<Integer, Integer> countOfVec2 = new HashMap<>();
for ( int item : vec2)
{
if (!countOfVec2.containsKey(item))
countOfVec2.put(item, 0 );
countOfVec2.put(item, countOfVec2.get(item) + 1 );
}
int prev = 0 ;
Vector<Integer> li = new Vector<Integer>();
for (Map.Entry<Integer, Integer> pair : countOfVec2.entrySet())
{
li.add(pair.getKey());
}
for ( int pair : li)
{
countOfVec2.put(pair, countOfVec2.get(pair) + prev);
prev = countOfVec2.get(pair);
}
for ( int item : vec1)
{
int i = 0 , v = 0 , last = 0 ;
for (Map.Entry<Integer, Integer> pair : countOfVec2.entrySet())
{
last = pair.getKey();
if (item < pair.getKey())
{
v = i;
break ;
}
i++;
}
v -= 1 ;
if (v == - 1 )
{
v = last;
}
int result = countOfVec2.get(v);
System.out.print(result + " " );
}
}
public static void main(String[] args)
{
int arr1[] = { 1 , 2 , 3 , 4 , 7 , 9 };
int arr2[] = { 0 , 1 , 2 , 1 , 1 , 4 };
countLessThanOrEqual(arr1, arr2);
}
}
|
Python3
def countLessThanOrEqual(vec1, vec2):
countOfVec2 = {}
for item in vec2:
if item not in countOfVec2:
countOfVec2[item] = 0
countOfVec2[item] + = 1
prev = 0
for pair in countOfVec2:
countOfVec2[pair] + = prev
prev = countOfVec2[pair]
val = list (countOfVec2)
for item in vec1:
i = 0
v = 0
for i in range ( len (val)):
if item < val[i]:
v = i
break
v - = 1
if v = = - 1 :
v = val[ - 1 ]
result = countOfVec2[v]
print (result, end = " " )
arr1 = [ 1 , 2 , 3 , 4 , 7 , 9 ]
arr2 = [ 0 , 1 , 2 , 1 , 1 , 4 ]
countLessThanOrEqual(arr1, arr2)
|
C#
using System;
using System.Collections.Generic;
class GFG {
static void countLessThanOrEqual( int [] vec1, int [] vec2)
{
Dictionary< int , int > countOfVec2 = new Dictionary< int , int >();
foreach ( int item in vec2)
{
if (!countOfVec2.ContainsKey(item))
countOfVec2[item] = 0;
countOfVec2[item] += 1;
}
int prev = 0;
List< int > li = new List< int >();
foreach (KeyValuePair< int , int > pair in countOfVec2)
{
li.Add(pair.Key);
}
foreach ( int pair in li)
{
countOfVec2[pair] += prev;
prev = countOfVec2[pair];
}
foreach ( int item in vec1)
{
int i = 0, v = 0, last = 0;
foreach (KeyValuePair< int , int > pair in countOfVec2)
{
last = pair.Key;
if (item < pair.Key)
{
v = i;
break ;
}
i++;
}
v -= 1;
if (v == -1)
{
v = last;
}
int result = countOfVec2[v];
Console.Write(result + " " );
}
}
static void Main()
{
int [] arr1 = {1, 2, 3, 4, 7, 9};
int [] arr2 = {0, 1, 2, 1, 1, 4};
countLessThanOrEqual(arr1, arr2);
}
}
|
Javascript
<script>
function countLessThanOrEqual(vec1,vec2)
{
let countOfVec2 = new Map();
for (let item = 0;item < vec2.length; item++)
{
if (!countOfVec2.has(vec2[item]))
countOfVec2.set(vec2[item], 0);
countOfVec2.set(vec2[item], countOfVec2.get(vec2[item]) + 1);
}
let prev = 0;
let li = [];
for (let [key, value] of countOfVec2.entries())
{
li.push(key);
}
for (let pair = 0; pair < li.length; pair++)
{
countOfVec2.set(pair, countOfVec2.get(li[pair]) + prev);
prev = countOfVec2.get(li[pair]);
}
for (let item=0; item<vec1.length;item++)
{
let i = 0, v = 0, last = 0;
for (let [key, value] of countOfVec2.entries())
{
last = key;
if (vec1[item] < key)
{
v = i;
break ;
}
i++;
}
v -= 1;
if (v == -1)
{
v = last;
}
let result = countOfVec2.get(v);
document.write(result + " " );
}
}
let arr1=[1, 2, 3, 4, 7, 9];
let arr2=[0, 1, 2, 1, 1, 4];
countLessThanOrEqual(arr1, arr2);
</script>
|
Complexity Analysis:
- Time Complexity: O(max) where max is the maximum element of both arrays.
- Auxiliary Complexity : O(max) where max is the maximum element of both arrays.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...