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++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; int getNumberK(vector< int >& S) { // vector to store freq. vector< int > freq(S.size() + 1, 0); // Filling freq vector. for ( int i = 0; i < S.size(); i++) { if (S[i] < S.size()) freq[S[i]]++; else freq[S.size()]++; } int total = 0; // Finding K number. for ( int i = S.size(); i >= 0; i--) { total += freq[i]; if (total >= i) return i; } // No K number found. return 0; } // Driver code int main() { vector< int > arr{ 3, 0, 6, 1, 5 }; cout << getNumberK(arr) << '\n' ; return 0; } |
Java
// Java program for the above approach import java.util.*; class GFG{ static int getNumberK(ArrayList<Integer> S) { // To store freq. int [] freq = new int [S.size() + 1 ]; // Filling freq vector. 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 ; // Finding K number. for ( int i = S.size(); i >= 0 ; i--) { total += freq[i]; if (total >= i) return i; } // No K number found. return 0 ; } // Driver code public static void main(String[] args) { ArrayList<Integer> arr = new ArrayList<>(Arrays.asList( 3 , 0 , 6 , 1 , 5 )); System.out.println(getNumberK(arr)); } } // This code is contributed by offbeat |
Python3
# Python3 program for the above approach def getNumberK(S): # Vector to store freq. freq = [ 0 ] * ( len (S) + 1 ) # Filling freq vector. for i in range ( len (S)): if (S[i] < len (S)): freq[S[i]] + = 1 else : freq[ len (S)] + = 1 total = 0 # Finding K number. for i in range ( len (S), - 1 , - 1 ): total + = freq[i] if (total > = i): return i # No K number found. return 0 # Driver code arr = [ 3 , 0 , 6 , 1 , 5 ] print (getNumberK(arr)) # This code is contributed by code_hunt |
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ static int getNumberK(List< int > S) { // To store freq. int [] freq = new int [S.Count + 1]; // Filling freq vector. for ( int i = 0; i < S.Count; i++) { if (S[i] < S.Count) freq[S[i]]++; else freq[S.Count]++; } int total = 0; // Finding K number. for ( int i = S.Count; i >= 0; i--) { total += freq[i]; if (total >= i) return i; } // No K number found. return 0; } // Driver code public static void Main(String[] args) { List< int > arr = new List< int >{ 3, 0, 6, 1, 5 }; Console.WriteLine(getNumberK(arr)); } } // This code is contributed by Amit Katiyar |
Javascript
<script> // Javascript program for // the above approach function getNumberK(S) { // To store freq. let freq = Array.from({length: S.length + 1}, (_, i) => 0); // Filling freq vector. for (let i = 0; i < S.length; i++) { if (S[i] < S.length) freq[S[i]]++; else freq[S.length]++; } let total = 0; // Finding K number. for (let i = S.length; i >= 0; i--) { total += freq[i]; if (total >= i) return i; } // No K number found. return 0; } // Driver code let arr = [3, 0, 6, 1, 5]; document.write(getNumberK(arr)); // This code is contributed by sourabhghosh0416. </script> |
3
Time Complexity O(N)
Space Complexity O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!