Given an array of non-negative integers arr[]. The task is to find a pair (n, r) such that value of nCr is maximum possible r < n.
nCr = n! / (r! * (n – r)!)
Examples:
Input: arr[] = {5, 2, 3, 4, 1}
Output: n = 5 and r = 2
5C3 = 5! / (3! * (5 – 3)!) = 10
Input: arr[] = {0, 2, 3, 4, 1, 6, 8, 9}
Output: n = 9 and r = 4
Naive approach: A simple approach is to consider each (n, r) pair and find the maximum possible value of nCr.
Efficient approach: It is known from combinatorics:
When n is odd:
nC0 < nC1 ….. < nC(n-1)/2 = nC(n+1)/2 > ….. > nCn-1 > nCn
When n is even:
nC0 < nC1 ….. < nCn/2 > ….. > nCn-1 > nCn
Also, nCr = nCn-r
It can be observed that nCr will be maximum when n will be maximum and abs(r – middle) will be minimum. The problem now boils down to finding the largest element in arr[] and r such that abs(r – middle) is minimum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findPair( int arr[], int n)
{
if (n < 2) {
cout << "-1" ;
return ;
}
int maximum = *max_element(arr, arr + n);
int temp = 10000001, r = 0, middle = maximum / 2;
for ( int i = 0; i < n; i++) {
if ( abs (middle - arr[i]) < temp && n % 2 == 0) {
temp = abs (middle - arr[i]);
r = arr[i];
}
else if (min( abs (middle - arr[i]), abs (middle + 1 - arr[i])) < temp
&& n % 2 == 1) {
temp = min( abs (middle - arr[i]), abs (middle + 1 - arr[i]));
r = arr[i];
}
}
cout << "n = " << maximum
<< " and r = " << r;
}
int main()
{
int arr[] = { 0, 2, 3, 4, 1, 6, 8, 9 };
int n = sizeof (arr) / sizeof (arr[0]);
findPair(arr, n);
return 0;
}
|
Java
class GFG
{
static void findPair( int arr[], int n)
{
if (n < 2 )
{
System.out.print( "-1" );
return ;
}
int maximum = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
maximum = Math.max(maximum, arr[i]);
int temp = 10000001 , r = 0 , middle = maximum / 2 ;
for ( int i = 0 ; i < n; i++)
{
if (Math.abs(middle - arr[i]) < temp && n % 2 == 0 )
{
temp = Math.abs(middle - arr[i]);
r = arr[i];
}
else if (Math.min(Math.abs(middle - arr[i]),
Math.abs(middle + 1 - arr[i])) <
temp && n % 2 == 1 )
{
temp = Math.min(Math.abs(middle - arr[i]),
Math.abs(middle + 1 - arr[i]));
r = arr[i];
}
}
System.out.print( "n = " + maximum + " and r = " + r);
}
public static void main(String args[])
{
int arr[] = { 0 , 2 , 3 , 4 , 1 , 6 , 8 , 9 };
int n = arr.length;
findPair(arr, n);
}
}
|
Python3
def find_pair(arr):
current_min_diff = float ( 'inf' )
n = max (arr)
middle = n / 2
for elem in arr:
diff = abs (elem - middle)
if diff < current_min_diff:
current_min_diff = diff
r = elem
print ( "n =" , n, "and r =" , r)
return r
if __name__ = = "__main__" :
arr = [ 0 , 2 , 3 , 4 , 1 , 6 , 8 , 9 ]
find_pair(arr)
|
C#
using System;
class GFG
{
static void findPair( int []arr, int n)
{
if (n < 2)
{
Console.Write( "-1" );
return ;
}
int maximum = arr[0];
for ( int i = 1; i < n; i++)
maximum = Math.Max(maximum, arr[i]);
int temp = 10000001, r = 0, middle = maximum / 2;
for ( int i = 0; i < n; i++)
{
if (Math.Abs(middle - arr[i]) < temp && n % 2 == 0)
{
temp = Math.Abs(middle - arr[i]);
r = arr[i];
}
else if (Math.Min(Math.Abs(middle - arr[i]),
Math.Abs(middle + 1 - arr[i])) <
temp && n % 2 == 1)
{
temp = Math.Min(Math.Abs(middle - arr[i]),
Math.Abs(middle + 1 - arr[i]));
r = arr[i];
}
}
Console.Write( "n = " + maximum +
" and r = " + r);
}
public static void Main(String []args)
{
int []arr = { 0, 2, 3, 4, 1, 6, 8, 9 };
int n = arr.Length;
findPair(arr, n);
}
}
|
Javascript
<script>
function findPair(arr,n)
{
if (n < 2)
{
document.write( "-1" );
return ;
}
let maximum = arr[0];
for (let i = 1; i < n; i++)
maximum = Math.max(maximum, arr[i]);
let temp = 10000001, r = 0, middle = maximum / 2;
for (let i = 0; i < n; i++)
{
if (Math.abs(middle - arr[i]) < temp && n % 2 == 0)
{
temp = Math.abs(middle - arr[i]);
r = arr[i];
}
else if (Math.min(Math.abs(middle - arr[i]),
Math.abs(middle + 1 - arr[i])) <
temp && n % 2 == 1)
{
temp = Math.min(Math.abs(middle - arr[i]),
Math.abs(middle + 1 - arr[i]));
r = arr[i];
}
}
document.write( "n = " + maximum + " and r = " + r);
}
let arr = [0, 2, 3, 4, 1, 6, 8, 9 ];
let n = arr.length;
findPair(arr, n);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)