Given an array arr[] and an integer K, the task is to find the K elements of the array whose absolute difference with median of array is maximum.
Note: If two elements have equal difference then the maximum element is taken into consideration.
Examples:
Input : arr[] = {1, 2, 3, 4, 5}, k = 3
Output : {5, 1, 4}
Explanation :
Median m = 3,
Difference of each array elements from median,
1 ==> diff(1-3) = 2
2 ==> diff(2-3) = 1
3 ==> diff(3-3) = 0
4 ==> diff(4-3) = 1
5 ==> diff(5-3) = 2
First K elements are 5, 1, 4 in this array.
Input: arr[] = {1, 2, 3}, K = 2
Output: {3, 1}
Approach:
- Sort the array and find the median of the array
- Create a difference array to store the difference of each element with the median of the sorted array.
- Highest difference elements will be the corner elements of the array. Therefore, initialize the two pointers as both the corner elements of the array that is 0 and N – 1.
- Finally include the elements of the array one by one with the maximum difference with the median.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
double findMedian( int a[], int n)
{
if (n % 2 != 0)
return ( double )a[n/2];
return ( double )(a[(n-1)/2] + a[n/2])/2.0;
}
void kStrongest( int arr[], int n, int k)
{
sort(arr, arr + n);
double median = findMedian(arr, n);
int diff[n];
for ( int i = 0; i < n; i++) {
diff[i] = abs (median - arr[i]);
}
int i = 0, j = n - 1;
while (k > 0) {
if (diff[i] > diff[j]) {
cout << arr[i] << " " ;
i++;
}
else {
cout << arr[j] << " " ;
j--;
}
k--;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int k = 3;
int n = sizeof (arr) / sizeof (arr[0]);
kStrongest(arr, n, k);
return 0;
}
|
Java
import java.util.*;
class GFG{
static double findMedian( int a[], int n)
{
if (n % 2 != 0 )
return ( double )a[n / 2 ];
return ( double )(a[(n - 1 ) / 2 ] +
a[n / 2 ]) / 2.0 ;
}
static void kStrongest( int arr[], int n, int k)
{
Arrays.sort(arr);
double median = findMedian(arr, n);
int []diff = new int [n];
for ( int i = 0 ; i < n; i++)
{
diff[i] = ( int )Math.abs(median - arr[i]);
}
int i = 0 , j = n - 1 ;
while (k > 0 )
{
if (diff[i] > diff[j])
{
System.out.print(arr[i] + " " );
i++;
}
else
{
System.out.print(arr[j] + " " );
j--;
}
k--;
}
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
int k = 3 ;
int n = arr.length;
kStrongest(arr, n, k);
}
}
|
Python3
def findMedian(a, n):
if (n % 2 ! = 0 ):
return a[ int (n / 2 )]
return (a[ int ((n - 1 ) / 2 )] +
a[ int (n / 2 )]) / 2.0
def kStrongest(arr, n, k):
arr.sort()
median = findMedian(arr, n)
diff = [ 0 ] * (n)
for i in range (n):
diff[i] = abs (median - arr[i])
i = 0
j = n - 1
while (k > 0 ):
if (diff[i] > diff[j]):
print (arr[i], end = " " )
i + = 1
else :
print (arr[j], end = " " )
j - = 1
k - = 1
arr = [ 1 , 2 , 3 , 4 , 5 ]
k = 3
n = len (arr)
kStrongest(arr, n, k)
|
C#
using System;
class GFG{
static double findMedian( int []a, int n)
{
if (n % 2 != 0)
return ( double )a[n / 2];
return ( double )(a[(n - 1) / 2] +
a[n / 2]) / 2.0;
}
static void kStrongest( int []arr, int n,
int k)
{
Array.Sort(arr);
int i = 0;
double median = findMedian(arr, n);
int []diff = new int [n];
for (i = 0; i < n; i++)
{
diff[i] = ( int )Math.Abs(median - arr[i]);
}
int j = n - 1;
i = 0;
while (k > 0)
{
if (diff[i] > diff[j])
{
Console.Write(arr[i] + " " );
i++;
}
else
{
Console.Write(arr[j] + " " );
j--;
}
k--;
}
}
public static void Main(String[] args)
{
int []arr = { 1, 2, 3, 4, 5 };
int k = 3;
int n = arr.Length;
kStrongest(arr, n, k);
}
}
|
Javascript
<script>
function findMedian(a, n)
{
if (n % 2 != 0)
return a[(Math.floor(n / 2))];
return (a[(Math.floor((n - 1) / 2))] +
a[(Math.floor(n / 2))]) / 2.0;
}
function kStrongest(arr, n, k)
{
arr.sort();
let median = findMedian(arr, n);
let diff = Array.from({length: n}, (_, i) => 0);
for (let i = 0; i < n; i++)
{
diff[i] = Math.abs(median - arr[i]);
}
let i = 0, j = n - 1;
while (k > 0)
{
if (diff[i] > diff[j])
{
document.write(arr[i] + " " );
i++;
}
else
{
document.write(arr[j] + " " );
j--;
}
k--;
}
}
let arr = [ 1, 2, 3, 4, 5 ];
let k = 3;
let n = arr.length;
kStrongest(arr, n, k);
</script>
|
Time Complexity: O(nlogn), where nlogn is the time complexity required to sort the given array
Auxiliary Space: O(n), extra space used to create a diff array
Another Approach:- In this approach we will se how we can reduce the space complexity to O(N)->O(1)
- There is no need to take difference array as in the above approach
- As we came to know that the difference will be maximum with corner values so no need to store the difference just take 2 pointer on start and end.
- Print the one which have greater difference and move that pointer
Implementation:-
C++
#include <bits/stdc++.h>
using namespace std;
double findMedian( int a[], int n)
{
if (n % 2 != 0)
return ( double )a[n/2];
return ( double )(a[(n-1)/2] + a[n/2])/2.0;
}
void kStrongest( int arr[], int n, int k)
{
sort(arr, arr + n);
double median = findMedian(arr, n);
int i = 0, j = n - 1;
while (k) {
if ( abs (median-arr[i]) > abs (median-arr[j])) {
cout << arr[i] << " " ;
i++;
}
else {
cout << arr[j] << " " ;
j--;
}
k--;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int k = 3;
int n = sizeof (arr) / sizeof (arr[0]);
kStrongest(arr, n, k);
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static double findMedian( int [] a, int n)
{
if (n % 2 != 0 ) {
return ( double )a[n / 2 ];
}
return ( double )(a[(n - 1 ) / 2 ] + a[n / 2 ]) / 2.0 ;
}
public static void kStrongest( int [] arr, int n, int k)
{
Arrays.sort(arr);
double median = findMedian(arr, n);
int i = 0 ;
int j = n - 1 ;
while (k != 0 ) {
if (Math.abs(median - arr[i])
> Math.abs(median - arr[j])) {
System.out.print(arr[i]);
System.out.print( " " );
i++;
}
else {
System.out.print(arr[j]);
System.out.print( " " );
j--;
}
k--;
}
}
public static void main(String[] args)
{
int [] arr = { 1 , 2 , 3 , 4 , 5 };
int k = 3 ;
int n = arr.length;
kStrongest(arr, n, k);
}
}
|
Python3
def findMedian(a, n):
if n % 2 ! = 0 :
return a[n / / 2 ]
return (a[(n - 1 ) / / 2 ] + a[n / / 2 ]) / 2
def kStrongest(arr, n, k):
arr.sort()
median = findMedian(arr, n)
i = 0
j = n - 1
while k:
if abs (median - arr[i]) > abs (median - arr[j]):
print (arr[i], end = " " )
i + = 1
else :
print (arr[j], end = " " )
j - = 1
k - = 1
arr = [ 1 , 2 , 3 , 4 , 5 ]
k = 3
n = len (arr)
kStrongest(arr, n, k)
|
C#
using System;
public class GFG
{
static double FindMedian( int [] a, int n)
{
if (n % 2 != 0)
return ( double )a[n / 2];
return ( double )(a[(n - 1) / 2] + a[n / 2]) / 2.0;
}
static void KStrongest( int [] arr, int n, int k)
{
Array.Sort(arr);
double median = FindMedian(arr, n);
int i = 0, j = n - 1;
while (k > 0) {
if (Math.Abs(median - arr[i]) > Math.Abs(median - arr[j])) {
Console.Write(arr[i] + " " );
i++;
}
else {
Console.Write(arr[j] + " " );
j--;
}
k--;
}
}
static void Main( string [] args)
{
int [] arr = { 1, 2, 3, 4, 5 };
int k = 3;
int n = arr.Length;
KStrongest(arr, n, k);
}
}
|
Javascript
function findMedian(a, n) {
if (n % 2 !== 0) {
return a[(Math.floor(n / 2))];
}
return (a[(n - 1) / 2] + a[n / 2]) / 2.0;
}
function kStrongest(arr, n, k) {
arr.sort( function (a, b) {
return a - b;
});
var median = findMedian(arr, n);
var i = 0;
var j = n - 1;
while (k !== 0) {
if (Math.abs(median - arr[i])
> Math.abs(median - arr[j])) {
console.log(arr[i] + " " );
i++;
}
else {
console.log(arr[j] + " " );
j--;
}
k--;
}
}
var arr = [ 1, 2, 3, 4, 5 ];
var k = 3;
var n = arr.length;
kStrongest(arr, n, k);
|
Time Complexity:- O(NlogN)
Auxiliary Space- O(1)