Hello Everyone,
Given an array arr of N integers, the task is to find the number of elements that satisfy the following condition:
If the element is X then there has to be exactly X number of elements in the array (excluding the number X ) which are greater than or equal to X
Examples:
Input: arr[] = {1, 2, 3, 4} Output: 1 Only element 2 satisfies the condition as there are exactly 2 elements which are greater than or equal to 2 (3, 4) except 2 itself. Input: arr[] = {5, 5, 5, 5, 5} Output: 0
Approach: The problem involves efficient searching for each arr[i] element the number of arr[j]’s (i != j) which are greater than or equal to arr[i].
- Sort the array in ascending order.
- For every element arr[i], using binary search get the count of all the elements that are greater than or equal to arr[i] except arr[i] itself.
- If the count is equal to arr[i] then increment the result.
- Print the value of the result in the end.
Below is the implementation of the above approach:
- C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using
namespace
std;
#define ll long long
ll
int
getCount(vector<ll
int
> v,
int
n)
{
// Sorting the vector
sort((v).begin(), (v).end());
ll
int
cnt = 0;
for
(ll
int
i = 0; i < n; i++) {
// Count of numbers which
// are greater than v[i]
ll
int
tmp = v.end() - 1
- upper_bound((v).begin(), (v).end(), v[i] - 1);
if
(tmp == v[i])
cnt++;
}
return
cnt;
}
// Driver code
int
main()
{
ll
int
n;
n = 4;
vector<ll
int
> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
cout << getCount(v, n);
return
0;
}
Output:
1