Noble integers in an array (count of greater elements is equal to value)
Given an array arr[], find a Noble integer in it. An integer x is said to be Noble in arr[] if the number of integers greater than x is equal to x. If there are many Noble integers, return any of them. If there is no, then return -1.
Examples :
Input : [7, 3, 16, 10]
Output : 3
Number of integers greater than 3
is three.
Input : [-1, -9, -2, -78, 0]
Output : 0
Number of integers greater than 0
is zero.
Method 1 (Brute Force): Iterate through the array. For every element arr[i], find the number of elements greater than arr[i].
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int nobleInteger( int arr[], int size)
{
for ( int i = 0; i < size; i++ )
{
int count = 0;
for ( int j = 0; j < size; j++)
if (arr[i] < arr[j])
count++;
if (count == arr[i])
return arr[i];
}
return -1;
}
int main()
{
int arr[] = {10, 3, 20, 40, 2};
int size = sizeof (arr) / sizeof (arr[0]);
int res = nobleInteger(arr, size);
if (res != -1)
cout<< "The noble integer is " << res;
else
cout<< "No Noble Integer Found" ;
}
|
Java
import java.util.ArrayList;
class GFG {
public static int nobleInteger( int arr[])
{
int size = arr.length;
for ( int i = 0 ; i < size; i++ )
{
int count = 0 ;
for ( int j = 0 ; j < size; j++)
if (arr[i] < arr[j])
count++;
if (count == arr[i])
return arr[i];
}
return - 1 ;
}
public static void main(String args[])
{
int [] arr = { 10 , 3 , 20 , 40 , 2 };
int res = nobleInteger(arr);
if (res != - 1 )
System.out.println( "The noble "
+ "integer is " + res);
else
System.out.println( "No Noble "
+ "Integer Found" );
}
}
|
Python3
def nobleInteger(arr, size):
for i in range ( 0 , size):
count = 0
for j in range ( 0 , size):
if (arr[i] < arr[j]):
count + = 1
if (count = = arr[i]):
return arr[i]
return - 1
arr = [ 10 , 3 , 20 , 40 , 2 ]
size = len (arr)
res = nobleInteger(arr,size)
if (res ! = - 1 ):
print ( "The noble integer is " ,
res)
else :
print ( "No Noble Integer Found" )
|
C#
using System;
class GFG {
public static int nobleInteger( int [] arr)
{
int size = arr.Length;
for ( int i = 0; i < size; i++ )
{
int count = 0;
for ( int j = 0; j < size; j++)
if (arr[i] < arr[j])
count++;
if (count == arr[i])
return arr[i];
}
return -1;
}
public static void Main()
{
int [] arr = {10, 3, 20, 40, 2};
int res = nobleInteger(arr);
if (res != -1)
Console.Write( "The noble integer"
+ " is " + res);
else
Console.Write( "No Noble Integer"
+ " Found" );
}
}
|
PHP
<?php
function nobleInteger( $arr , $size )
{
for ( $i = 0; $i < $size ; $i ++ )
{
$count = 0;
for ( $j = 0; $j < $size ; $j ++)
if ( $arr [ $i ] < $arr [ $j ])
$count ++;
if ( $count == $arr [ $i ])
return $arr [ $i ];
}
return -1;
}
$arr = array (10, 3, 20, 40, 2);
$size = count ( $arr );
$res = nobleInteger( $arr , $size );
if ( $res != -1)
echo "The noble integer is " , $res ;
else
echo "No Noble Integer Found" ;
?>
|
Javascript
<script>
function nobleInteger(arr)
{
let size = arr.length;
for (let i = 0; i < size; i++ )
{
let count = 0;
for (let j = 0; j < size; j++)
if (arr[i] < arr[j])
count++;
if (count == arr[i])
return arr[i];
}
return -1;
}
let arr=[10, 3, 20, 40, 2];
let res = nobleInteger(arr);
if (res != -1)
document.write( "The noble "
+ "integer is " + res);
else
document.write( "No Noble "
+ "Integer Found" );
</script>
|
Output
The noble integer is 3
Time Complexity: O(n*n) where n is size of input array. This is because two nested for loops are executed.
Space Complexity: O(1) as no extra space has been taken.
Method 2 (Use Sorting)
- Sort the Array arr[] in ascending order. This step takes (O(nlogn)).
- Iterate through the array. Compare the value of index i to the number of elements after index i. If arr[i] equals the number of elements after arr[i], it is a noble Integer. Condition to check: (A[i] == length-i-1). This step takes O(n).
Note: Array may have duplicate elements. So, we should skip the elements (adjacent elements in the sorted array) that are same.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
int nobleInteger( int arr[], int n)
{
sort(arr, arr + n);
for ( int i = 0; i < n - 1; i++)
{
if (arr[i] == arr[i + 1])
continue ;
if (arr[i] == n - i - 1)
return arr[i];
}
if (arr[n - 1] == 0)
return arr[n - 1];
return -1;
}
int main()
{
int arr[] = {10, 3, 20, 40, 2};
int res = nobleInteger(arr, 5);
if (res != -1)
cout << "The noble integer is " << res;
else
cout << "No Noble Integer Found" ;
return 0;
}
|
Java
import java.util.Arrays;
public class Main
{
public static int nobleInteger( int arr[])
{
Arrays.sort(arr);
int n = arr.length;
for ( int i= 0 ; i<n- 1 ; i++)
{
if (arr[i] == arr[i+ 1 ])
continue ;
if (arr[i] == n-i- 1 )
return arr[i];
}
if (arr[n- 1 ] == 0 )
return arr[n- 1 ];
return - 1 ;
}
public static void main(String args[])
{
int [] arr = { 10 , 3 , 20 , 40 , 2 };
int res = nobleInteger(arr);
if (res != - 1 )
System.out.println( "The noble integer is " + res);
else
System.out.println( "No Noble Integer Found" );
}
}
|
Python3
def nobleInteger(arr):
arr.sort()
n = len (arr)
for i in range (n - 1 ):
if arr[i] = = arr[i + 1 ]:
continue
if arr[i] = = n - i - 1 :
return arr[i]
if arr[n - 1 ] = = 0 :
return arr[n - 1 ]
return - 1
arr = [ 10 , 3 , 20 , 40 , 2 ]
res = nobleInteger(arr)
if res ! = - 1 :
print ( "The noble integer is" , res)
else :
print ( "No Noble Integer Found" )
|
C#
using System;
public class GFG {
public static int nobleInteger( int [] arr)
{
Array.Sort(arr);
int n = arr.Length;
for ( int i = 0; i < n-1; i++)
{
if (arr[i] == arr[i+1])
continue ;
if (arr[i] == n-i-1)
return arr[i];
}
if (arr[n-1] == 0)
return arr[n-1];
return -1;
}
static public void Main ()
{
int [] arr = {10, 3, 20, 40, 2};
int res = nobleInteger(arr);
if (res != -1)
Console.Write( "The noble integer is "
+ res);
else
Console.Write( "No Noble Integer "
+ "Found" );
}
}
|
PHP
<?php
function nobleInteger( $arr )
{
sort( $arr );
$n = count ( $arr );
for ( $i = 0; $i < $n - 1; $i ++)
{
if ( $arr [ $i ] == $arr [ $i + 1])
continue ;
if ( $arr [ $i ] == $n - $i - 1)
return $arr [ $i ];
}
if ( $arr [ $n - 1] == 0)
return $arr [ $n - 1];
return -1;
}
$arr = array (10, 3, 20, 40, 2);
$res = nobleInteger( $arr );
if ( $res != -1)
echo "The noble integer is " , $res ;
else
echo "No Noble Integer Found" ;
?>
|
Javascript
<script>
function nobleInteger(arr)
{
arr.sort( function (a, b){ return a - b;});
let n = arr.length;
for (let i = 0; i < n - 1; i++)
{
if (arr[i] == arr[i + 1])
continue ;
if (arr[i] == n - i - 1)
return arr[i];
}
if (arr[n - 1] == 0)
return arr[n - 1];
return -1;
}
let arr = [ 10, 3, 20, 40, 2 ];
let res = nobleInteger(arr);
if (res != -1)
document.write( "The noble integer is " + res);
else
document.write( "No Noble Integer Found" );
</script>
|
Output
The noble integer is 3
Method 3 (Using Count Array):
Maintain a count array countArr[] which keeps count of all elements greater than or equal to arr[i].
- Declare an integer array countArr[] of size n + 1 (where n is the size of given array arr), and initialize it as zero.
- Iterate through array arr, if arr[i] < 0, we ignore it, if arr[i] >= n, we increment countArr[n], else simply increment countArr[arr[i]].
- Declare an integer totalGreater, which keeps count of elements greater than current element, and initialize it as countArr[arr[n]].
- Iterate through count array countArr from last to first index, if at any point we find that totalGreater = i for countArr[i] > 0, we have found our solution. Else keep increasing totalGreater with countArr[i].
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int nobleInteger( int arr[], int n)
{
int countArr[n + 1] = { 0 };
for ( int i = 0; i < n; i++) {
if (arr[i] < 0) {
continue ;
}
else if (arr[i] >= n) {
countArr[n]++;
}
else {
countArr[arr[i]]++;
}
}
int totalGreater = countArr[n];
for ( int i = n - 1; i >= 0; i--) {
if (totalGreater == i && countArr[i] > 0) {
return i;
}
else if (totalGreater > i) {
return -1;
}
totalGreater += countArr[i];
}
return -1;
}
int main()
{
int arr[] = { 10, 3, 20, 40, 2 };
int res = nobleInteger(arr, 5);
if (res != -1)
cout << "The noble integer is " << res;
else
cout << "No Noble Integer Found" ;
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static int nobleInteger( int arr[], int n) {
int countArr[] = new int [n + 1 ];
Arrays.fill(countArr, 0 );
for ( int i = 0 ; i < n; i++) {
if (arr[i] < 0 ) {
continue ;
}
else if (arr[i] >= n) {
countArr[n]++;
}
else {
countArr[arr[i]]++;
}
}
int totalGreater = countArr[n];
for ( int i = n - 1 ; i >= 0 ; i--) {
if (totalGreater == i && countArr[i] > 0 ) {
return i;
}
else if (totalGreater > i) {
return - 1 ;
}
totalGreater += countArr[i];
}
return - 1 ;
}
public static void main(String args[]) {
int arr[] = { 10 , 3 , 20 , 40 , 2 };
int res = nobleInteger(arr, 5 );
if (res != - 1 )
System.out.println( "The noble integer is " + res);
else
System.out.println( "No Noble Integer Found" );
}
}
|
Python3
def nobleInteger(arr, n):
countArr = [ 0 ] * (n + 1 )
for i in range (n):
if (arr[i] < 0 ):
continue
else if (arr[i] > = n):
countArr[n] + = 1
else :
countArr[arr[i]] + = 1
totalGreater = countArr[n]
for i in range (n - 1 , - 1 , - 1 ):
if (totalGreater = = i and countArr[i] > 0 ):
return i
else if (totalGreater > i):
return - 1
totalGreater + = countArr[i]
return - 1
arr = [ 10 , 3 , 20 , 40 , 2 ]
res = nobleInteger(arr, 5 )
if (res ! = - 1 ):
print (f "The noble integer is {res}" )
else :
print ( "No Noble Integer Found" )
|
C#
using System;
public class GFG {
static int nobleInteger( int [] arr, int n)
{
int [] countArr = new int [n + 1];
for ( int i = 0; i < n + 1; i++)
countArr[i] = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] < 0) {
continue ;
}
else if (arr[i] >= n) {
countArr[n]++;
}
else {
countArr[arr[i]]++;
}
}
int totalGreater = countArr[n];
for ( int i = n - 1; i >= 0; i--) {
if (totalGreater == i && countArr[i] > 0) {
return i;
}
else if (totalGreater > i) {
return -1;
}
totalGreater += countArr[i];
}
return -1;
}
static public void Main()
{
int [] arr = { 10, 3, 20, 40, 2 };
int n = arr.Length;
int res = nobleInteger(arr, n);
if (res != -1)
Console.Write( "The noble integer is " + res);
else
Console.Write( "No Noble Integer "
+ "Found" );
}
}
|
Javascript
<script>
function nobleInteger(arr, n)
{
let countArr = new Uint8Array(n + 1);
for (let i = 0; i < n; i++)
{
if (arr[i] < 0)
{
continue ;
}
else if (arr[i] >= n)
{
countArr[n]++;
}
else
{
countArr[arr[i]]++;
}
}
let totalGreater = countArr[n];
for (let i = n - 1; i >= 0; i--)
{
if (totalGreater == i && countArr[i] > 0)
{
return i;
}
else if (totalGreater > i)
{
return -1;
}
totalGreater += countArr[i];
}
return -1;
}
let arr = [ 10, 3, 20, 40, 2 ];
let res = nobleInteger(arr, 5);
if (res != -1)
document.write( "The noble integer is " + res);
else
document.write( "No Noble Integer Found" );
</script>
|
Output
The noble integer is 3
- Complexity Analysis:
- Time Complexity: O(n). As we iterate through both input array and countArr once.
- Space Complexity: O(n). As we use countArr of size same as given array.
Last Updated :
19 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...