Given an array arr[] of non-negative integers of size N, the task is to find an integer H such that at least K integers in the array are greater or equal to K.
Examples:
Input: arr[] = [3, 0, 6, 1, 5]
Output: 3
Explanation: There are 3 number greater than or equal to 3 in the array i.e. 3, 6 and 5.
Input: arr[] = [9, 10, 7, 5, 0, 10, 2, 0]
Output: 5
Approach: Using Hashing
The number integer K can not be greater than the size of arr[]. So, maintain the frequency of each element in a frequency array(hash table). Then traverse the frequency array from the end and return the first index that matches the condition.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int getNumberK(vector< int >& S)
{
vector< int > freq(S.size() + 1,
0);
for ( int i = 0; i < S.size();
i++) {
if (S[i] < S.size())
freq[S[i]]++;
else
freq[S.size()]++;
}
int total = 0;
for ( int i = S.size(); i >= 0;
i--) {
total += freq[i];
if (total >= i)
return i;
}
return 0;
}
int main()
{
vector< int > arr{ 3, 0, 6, 1, 5 };
cout << getNumberK(arr) << '\n' ;
return 0;
}
|
Java
import java.util.*;
class GFG{
static int getNumberK(ArrayList<Integer> S)
{
int [] freq = new int [S.size() + 1 ];
for ( int i = 0 ; i < S.size(); i++)
{
if (S.get(i) < S.size())
freq[S.get(i)]++;
else
freq[S.size()]++;
}
int total = 0 ;
for ( int i = S.size(); i >= 0 ; i--)
{
total += freq[i];
if (total >= i)
return i;
}
return 0 ;
}
public static void main(String[] args)
{
ArrayList<Integer> arr =
new ArrayList<>(Arrays.asList( 3 , 0 , 6 , 1 , 5 ));
System.out.println(getNumberK(arr));
}
}
|
Python3
def getNumberK(S):
freq = [ 0 ] * ( len (S) + 1 )
for i in range ( len (S)):
if (S[i] < len (S)):
freq[S[i]] + = 1
else :
freq[ len (S)] + = 1
total = 0
for i in range ( len (S), - 1 , - 1 ):
total + = freq[i]
if (total > = i):
return i
return 0
arr = [ 3 , 0 , 6 , 1 , 5 ]
print (getNumberK(arr))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int getNumberK(List< int > S)
{
int [] freq = new int [S.Count + 1];
for ( int i = 0; i < S.Count; i++)
{
if (S[i] < S.Count)
freq[S[i]]++;
else
freq[S.Count]++;
}
int total = 0;
for ( int i = S.Count; i >= 0; i--)
{
total += freq[i];
if (total >= i)
return i;
}
return 0;
}
public static void Main(String[] args)
{
List< int > arr = new List< int >{ 3, 0, 6, 1, 5 };
Console.WriteLine(getNumberK(arr));
}
}
|
Javascript
<script>
function getNumberK(S)
{
let freq = Array.from({length: S.length + 1}, (_, i) => 0);
for (let i = 0; i < S.length; i++)
{
if (S[i] < S.length)
freq[S[i]]++;
else
freq[S.length]++;
}
let total = 0;
for (let i = S.length; i >= 0; i--)
{
total += freq[i];
if (total >= i)
return i;
}
return 0;
}
let arr = [3, 0, 6, 1, 5];
document.write(getNumberK(arr));
</script>
|
Time Complexity O(N)
Space Complexity O(N)