Given an array arr[] of positive integers of even length, the task is to partition these elements of arr[] into two groups each of odd length such that the absolute difference between the median of the two groups is minimized.
Examples:
Input: arr[] = { 1, 2, 3, 4, 5, 6 }
Output: 1
Explanation:
Group 1 can be [2, 4, 6] with median 4
Group 2 can be [1, 3, 5] with median 3.
The absolute difference between the two medians is 4 – 3 = 1, which can’t be minimized further with any kind of groupings formed.
Input: arr[] = { 15, 25, 35, 50 }
Output: 10
Explanation:
Group 1 can be [15, 25, 50] with median 25
Group 2 can be [35] with median 35.
The absolute difference between the two medians is 35 – 25 = 10, which can’t be minimized further with any kind of groupings formed.
Approach:
- If the given array arr[] is sorted, the middle elements of arr[] will give the minimum difference.
- So divide the arr[] in such a way that these two elements will be the median of two new arrays of odd length.
- Therefore, put the n/2th element of the arr[] in the first group and the (n/2 – 1)th element of the arr[] in the second group as a median respectively.
- Then abs(arr[n/2] – arr[(n/2)-1]) is the minimum difference between the two new arrays.
Below is the implementation of the above approach:
// C++ program to minimize the // median between partition array #include "bits/stdc++.h" using namespace std;
// Function to find minimize the // median between partition array int minimizeMedian( int arr[], int n)
{ // Sort the given array arr[]
sort(arr, arr + n);
// Return the difference of two
// middle element of the arr[]
return abs (arr[n / 2] - arr[(n / 2) - 1]);
} // Driver Code int main()
{ int arr[] = { 15, 25, 35, 50 };
// Size of arr[]
int n = sizeof (arr) / sizeof (arr[0]);
// Function that returns the minimum
// the absolute difference between
// median of partition array
cout << minimizeMedian(arr, n);
return 0;
} |
// Java program to minimise the // median between partition array import java.util.*;
class GFG
{ // Function to find minimise the
// median between partition array
static int minimiseMedian( int arr[], int n)
{
// Sort the given array arr[]
Arrays.sort(arr);
// Return the difference of two
// middle element of the arr[]
return Math.abs(arr[n / 2 ] - arr[(n / 2 ) - 1 ]);
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 15 , 25 , 35 , 50 };
// Size of arr[]
int n = arr.length;
// Function that returns the minimum
// the absolute difference between
// median of partition array
System.out.println(minimiseMedian(arr, n));
}
} // This code is contributed by AnkitRai01 |
# Python3 program to minimise the # median between partition array # Function to find minimise the # median between partition array def minimiseMedian(arr, n) :
# Sort the given array arr[]
arr.sort();
# Return the difference of two
# middle element of the arr[]
ans = abs (arr[n / / 2 ] - arr[(n / / 2 ) - 1 ]);
return ans;
# Driver Code if __name__ = = "__main__" :
arr = [ 15 , 25 , 35 , 50 ];
# Size of arr[]
n = len (arr);
# Function that returns the minimum
# the absolute difference between
# median of partition array
print (minimiseMedian(arr, n));
# This code is contributed by AnkitRai01 |
// C# program to minimise the // median between partition array using System;
class GFG
{ // Function to find minimise the
// median between partition array
static int minimiseMedian( int []arr, int n)
{
// Sort the given array []arr
Array.Sort(arr);
// Return the difference of two
// middle element of the []arr
return Math.Abs(arr[n / 2] - arr[(n / 2) - 1]);
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 15, 25, 35, 50 };
// Size of []arr
int n = arr.Length;
// Function that returns the minimum
// the absolute difference between
// median of partition array
Console.WriteLine(minimiseMedian(arr, n));
}
} // This code is contributed by 29AjayKumar |
<script> // JavaScript program to minimise the // median between partition array // Function to find minimise the // median between partition array function minimiseMedian(arr, n) {
// Sort the given array arr[]
arr.sort((a, b) => a - b);
// Return the difference of two
// middle element of the arr[]
return Math.abs(arr[n / 2] - arr[(n / 2) - 1]);
} // Driver Code let arr = [15, 25, 35, 50]; // Size of arr[] let n = arr.length; // Function that returns the minimum // the absolute difference between // median of partition array document.write(minimiseMedian(arr, n)); // This code is contributed by gfgking </script> |
10
Time Complexity: O(N*log N)
Auxiliary Space: O(1)