给定一个偶数长度为正整数的数组arr [] ,任务是将arr []的这些元素划分为两组,每组奇数长度,以使两组中位数之间的绝对差最小。
例子:
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.
方法:
- 如果给定的阵列ARR []进行排序,ARR的中间元件[]将给出最小差值。
- 因此,以这样的方式对arr []进行划分,以使这两个元素成为两个新的奇数长度数组的中值。
- 因此,把ARR []的第n / 2个元件中的第一组中和第(n / 2 – 1)第二组中的ARR []分别作为中值的第i个元素。
- 那么abs(arr [n / 2] – arr [(n / 2)-1])是两个新数组之间的最小差。
下面是上述方法的实现:
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
输出:
10
时间复杂度: O(N * log N)