Find K for every Array element such that at least K prefixes are ≥ K
Last Updated :
27 May, 2021
Given an array arr[] consisting of N non-negative integers, the task is to find an integer K for every index such that at least K integers in the array till that index are greater or equal to K.
Note: Consider 1-based indexing
Examples:
Input: arr[] = {3, 0, 6, 1, 5}
Output: K = {1, 1, 2, 2, 3}
Explanation:
At index 1, there is 1 number greater than or equal to 1 in the array i.e. 3. So the K value for elements up to index 1 is 1.
At index 2, there is 1 number greater than or equal to 1 in the array i.e. 3. So the K value for elements up to index 2 is 1.
At index 3, there are 2 numbers greater than or equal to 2 in the array, i.e. 3 and 6. So the K value for elements up to index 3 is 2.
At index 4, there are 2 numbers greater than or equal to 2 in the array, i.e. 3 and 6. So the K value for elements up to index 4 is 2.
At index 5, there are 3 numbers greater than or equal to 3 in the array, i.e. 3, 6 and 5. So the K value for elements up to index 5 is 3.
Input: arr[] = {9, 10, 7, 5, 0, 10, 2, 0}
Output: K = {1, 2, 3, 4, 4, 5, 5, 5}
Naive Approach:
The simplest approach is to find the value of K for all the elements of the array in the range [0, i], where i is the index of the array arr[], using the efficient approach used in the article link is given here.
Time Complexity: O(N2)
Space Complexity: O(N)
Efficient Approach:
The idea is to use Multiset(Red-Black Tree). Multiset stores the values in a sorted order which helps to check if the current minimum value in the multiset is greater than or equal to its size. If yes, then the value of the integer K will be the size of the multiset.
Below are the steps for the implementation:
- Traverse the array from index 0 to N-1.
- For each index, insert the element into the multiset and check if the smallest value in the multiset is less than the size of the multiset.
- If true, then erase the starting element and print the size of the multiset.
- If false, then simply print the size of the multiset.
- The size of the multiset is the required K value for every index i.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int print_h_index( int arr[], int N)
{
multiset< int > ms;
for ( int i = 0; i < N; i++) {
ms.insert(arr[i]);
if (*ms.begin()
< ms.size()) {
ms.erase(ms.begin());
}
cout << ms.size() << " " ;
}
}
int main()
{
int arr[] = { 9, 10, 7, 5, 0,
10, 2, 0 };
int N = sizeof (arr)
/ sizeof (arr[0]);
print_h_index(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void print_h_index( int arr[], int N)
{
List<Integer> ms = new ArrayList<Integer>();
for ( int i = 0 ; i < N; i++)
{
ms.add(arr[i]);
int t = Collections.min(ms);
if (t < ms.size())
{
ms.remove(ms.indexOf(t));
}
System.out.print(ms.size() + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 9 , 10 , 7 , 5 , 0 ,
10 , 2 , 0 };
int N = arr.length;
print_h_index(arr, N);
}
}
|
Python3
def print_h_index(arr, N):
ms = []
for i in range (N):
ms.append(arr[i])
ms.sort()
if (ms[ 0 ] < len (ms)):
ms.pop( 0 )
print ( len (ms), end = ' ' )
if __name__ = = '__main__' :
arr = [ 9 , 10 , 7 , 5 , 0 , 10 , 2 , 0 ]
N = len (arr)
print_h_index(arr, N)
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
static void print_h_index( int []arr, int N)
{
ArrayList ms = new ArrayList();
for ( int i = 0; i < N; i++)
{
ms.Add(arr[i]);
int t = int .MaxValue;
foreach ( int x in ms)
{
if (x < t)
{
t = x;
}
}
if (t < ms.Count)
{
ms.Remove(t);
}
Console.Write(ms.Count + " " );
}
}
public static void Main( string [] args)
{
int []arr = { 9, 10, 7, 5, 0,
10, 2, 0 };
int N = arr.Length;
print_h_index(arr, N);
}
}
|
Javascript
<script>
function print_h_index(arr, N)
{
var ms = [];
for ( var i = 0; i < N; i++) {
ms.push(arr[i]);
ms.sort((a,b)=> a-b)
if (ms[0]
< ms.length) {
ms.shift();
}
document.write( ms.length + " " );
}
}
var arr = [9, 10, 7, 5, 0,
10, 2, 0 ];
var N = arr.length;
print_h_index(arr, N);
</script>
|
Time Complexity: O(N * log(N))
Auxiliary Space Complexity: O(N)
Share your thoughts in the comments
Please Login to comment...