Skip to content
Related Articles

Related Articles

Partition the array into two odd length groups with minimized absolute difference between their median
  • Difficulty Level : Medium
  • Last Updated : 03 Mar, 2020

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++




// C++ program to minimise the
// median between partition array
  
#include "bits/stdc++.h"
using namespace std;
  
// Function to find minimise the
// median between partition array
int minimiseMedian(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 << minimiseMedian(arr, n);
    return 0;
}

Java




// 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




# 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#




// 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
Output:
10

Time Complexity: O(N*log N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :