Maximize median of Array formed by adding elements of two other Arrays
Last Updated :
19 Feb, 2023
Given two arrays x[] and y[] of N integers, the task is to form an array z[] of x[i] + y[j], (0 ?i, j < N) and find the max value of median of z[] formed by optimal rearrangement.
Examples:
Input: N = 5, x[] = {1, 2, 3, 5, 6}, y[] = {4, 7, 0, 9, 8}
Output: 12
Explanation: Let, z[] = { 1+0, 2+4, 5+7, 3+9, 6+8} = {1, 6, 12, 12, 14}
to get maximum Median i.e., 12.
Input: N = 1, x[] = {11}, y[] = {12}
Output: 23
Approach: The problem can be solved based on the following idea:
The idea is to sort the array, and
- For first half (before the median positions) the new array must has the smallest possible elements to just discard this half of elements from both the arrays,
- Then from median positions onwards, traverse from right end of 1st array, and from median position of 2nd array, moving in opposite directions,
Find the minimum element formed by sum of these elements, that minimum element will be the median of the new array.
Follow the steps to solve this problem:
- If N =1, return x[0]+ y[0] as there is only single element,
- Otherwise, do the following steps
- First, sort both arrays and then divide the array from min to median-1 and median to max,
- Then, traverse from median to max and find the sum of opposite elements like, x[Median]+y[n-1], x[median+1]+y[n-2]…. up to Max.
- Out of these sums calculated above, the minimum one would be the median of the new array.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
double findMedian( int * x, int * y, int n)
{
if (n == 1) {
cout << x[0] + y[0] << endl;
}
else {
sort(x, x + n);
sort(y, y + n);
int i = (n - 1) / 2;
int j = n - 1;
double Med = INT_MAX;
if (n & 1) {
while (i < n) {
Med = min(Med,
( double )(x[i++] + y[j--]));
}
}
else {
vector< int > v;
while (i < n) {
v.push_back(x[i++] + y[j--]);
}
sort(v.begin(), v.end());
Med = ( double )(v[0] + v[1]) / 2;
}
return Med;
}
}
int main()
{
int x[] = { 1, 2, 3, 5, 6 };
int y[] = { 4, 7, 0, 9, 8 };
int N = 5;
cout << findMedian(x, y, N) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void findMedian( int [] x, int [] y, int n)
{
if (n == 1 ) {
System.out.print( x[ 0 ] + y[ 0 ]);
}
else {
Arrays.sort(x);
Arrays.sort(y);
int i = (n - 1 ) / 2 ;
int j = n - 1 ;
int Med = Integer.MAX_VALUE;
if ((n & 1 ) != 0 ) {
while (i < n) {
Med = Math.min(Med,
(x[i++] + y[j--]));
}
}
else {
ArrayList<Integer> v
= new ArrayList<Integer>(n);
while (i < n) {
v.add(x[i++] + y[j--]);
}
Collections.sort(v);
Med = ((v.get( 0 ) + v.get( 1 )) / 2 );
}
System.out.print( Med);
}
}
public static void main(String[] args)
{
int x[] = { 1 , 2 , 3 , 5 , 6 };
int y[] = { 4 , 7 , 0 , 9 , 8 };
int N = 5 ;
findMedian(x, y, N);
}
}
|
Python3
def findMedian(x, y, n):
if (n = = 1 ):
return (x[ 0 ] + y[ 0 ])
else :
x.sort()
y.sort()
i = (n - 1 ) / / 2
j = n - 1
Med = 100000000000000000
if (n % 2 = = 1 ):
while (i < n):
Med = min (Med, (x[i] + y[j]))
j - = 1
i + = 1
else :
v = []
while (i < n):
v.append(x[i] + y[j])
i + = 1
j - = 1
v.sort()
Med = (v[ 0 ] + v[ 1 ]) / / 2
return Med
if __name__ = = "__main__" :
x = [ 1 , 2 , 3 , 5 , 6 ]
y = [ 4 , 7 , 0 , 9 , 8 ]
N = 5
print ( " The maximum median formed by addition of two array is :" ,findMedian(x, y, N))
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
public class GFG {
static void findMedian( int [] x, int [] y, int n)
{
if (n == 1) {
Console.Write(x[0] + y[0]);
}
else {
Array.Sort(x);
Array.Sort(y);
int i = (n - 1) / 2;
int j = n - 1;
int Med = Int32.MaxValue;
if ((n & 1) != 0) {
while (i < n) {
Med = Math.Min(Med, (x[i++] + y[j--]));
}
}
else {
ArrayList v = new ArrayList(n);
while (i < n) {
v.Add(x[i++] + y[j--]);
}
v.Sort();
Med = (( int )v[0] + ( int )v[1]) / 2;
}
Console.Write(Med);
}
}
static public void Main()
{
int [] x = { 1, 2, 3, 5, 6 };
int [] y = { 4, 7, 0, 9, 8 };
int N = 5;
findMedian(x, y, N);
}
}
|
Javascript
<script>
function findMedian(x, y, n)
{
if (n == 1) {
document.write(x[0] + y[0]);
}
else {
x.sort();
y.sort();
let i = (n - 1) / 2;
let j = n - 1;
let Med = Number.MAX_VALUE;
if ((n & 1) != 0) {
while (i < n) {
Med = Math.min(Med, (x[i++] + y[j--]));
}
}
else {
v = [];
while (i < n) {
v.push(x[i++] + y[j--]);
}
v.sort();
Med = (v[0] + v[1]) / 2;
}
document.write(Med);
}
}
let x = [ 1, 2, 3, 5, 6 ];
let y = [ 4, 7, 0, 9, 8 ];
let N = 5;
findMedian(x, y, N);
</script>
|
Time Complexity: O(N * log N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...