Minimum number of elements to add to make median equals x

A median in an array with the length of n is an element which occupies position number (n+1)/2 after we sort the elements in the non-decreasing order (the array elements are numbered starting with 1). A median of an array (2, 6, 1, 2, 3) is the number 2, and a median of array (0, 96, 17, 23) — the number 17.

Examples :

Input : 3 10
        10 20 30
Output : 1
In the first sample we can add number 9 
to array (10, 20, 30). The resulting array
(9, 10, 20, 30) will have a median in 
position (4+1)/2 = 2, that is, 10

Input : 3 4
        1 2 3
Output : 4
In the second sample you should add numbers 
4, 5, 5, 5. The resulting array has median
equal to 4.

First Approach:- The approach is to add one more number x to the array until the median of the array equals to x. Below is the implementation of the above approach:-

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find minimum number
// of elements needs to add to the 
// array so that its median equals x.
#include <bits/stdc++.h>
using namespace std;
  
// Returns count of elements to be 
// added to make median x. This function
// assumes that a[] has enough extra space.
int minNumber(int a[], int n, int x)
{    
    // to sort the array in increasing order.
    sort(a, a + n);
  
    int k;
    for (k = 0; a[(n - 1) / 2] != x; k++) {
        a[n++] = x;
        sort(a, a + n);
    }
    return k;
}
  
// Driver code
main()
{
    int x = 10;
    int a[6] = { 10, 20, 30 };
    int n = 3;
    cout << minNumber(a, n, x) << endl;
    return 0;
}

chevron_right


Python3

# Python 3 program to find minimum number
# of elements needs to add to the
# array so that its median equals x.

# Returns count of elements to be added
# to make median x. This function
# assumes that a[] has enough extra space.
def minNumber(a, n, x):

# to sort the array in increasing order.
a.sort(reverse = False)
k = 0
while(a[int((n – 1) / 2)] != x):
a[n – 1] = x
n += 1
a.sort(reverse = False)
k += 1

return k

# Driver code
if __name__ == ‘__main__’:
x = 10
a = [10, 20, 30]
n = 3
print(minNumber(a, n, x))

# This code is contributed by
# Surendra_Gangwar

PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find minimum 
// number of elements needs to 
// add to the array so that its
// median equals x.
  
// Returns count of elements 
// to be added to make median 
// x. This function assumes 
// that a[] has enough extra space.
function minNumber($a, $n, $x)
    // to sort the array in 
    // increasing order.
    sort($a);
  
    $k;
    for ($k = 0; 
         $a[($n - 1) / 2] != $x; $k++) 
    {
        $a[$n++] = $x;
        sort($a);
    }
    return $k;
}
  
// Driver code
$x = 10;
$a = array (10, 20, 30);
$n = 3;
echo minNumber($a, $n, $x),"\n";
  
// This code is contributed by ajit
?>

chevron_right



Output :

1

Time complexity : O(knLogn)

Second Approach:- Better approach is to count all the elements equal to x(that is e), greater than x(that is h) and smaller than x(that is l). And then –
if l is greater than h then, the ans will be (l – h) + 1 – e;
And if h is greater than l then, ans will be (h – l – 1) + 1 – e;

We can use Hoare’s partition scheme to count smaller, equal and greater elements.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find minimum number of 
// elements to add so that its median 
// equals x.
#include <bits/stdc++.h>
using namespace std;
  
int minNumber(int a[], int n, int x)
{
    int l = 0, h = 0, e = 0;
    for (int i = 0; i < n; i++) {
  
        // no. of elements equals to x, 
        // that is, e.
        if (a[i] == x)
            e++;
  
        // no. of elements greater than x, 
        // that is, h.
        else if (a[i] > x)
            h++;
  
        // no. of elements smaller than x,
        // that is, l.
        else if (a[i] < x)
            l++;
    }
  
    int ans = 0;
    if (l > h) 
        ans = l - h;
    else if (l < h) 
        ans = h - l - 1;
      
    // subtract the no. of elements 
    // that are equal to x.
    return ans + 1 - e;
}
  
// Driver code
int main()
{
    int x = 10;
    int a[] = { 10, 20, 30 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << minNumber(a, n, x) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find minimum number
// of elements to add so that its 
// median equals x.
import java.util.*;
import java.lang.*;
  
class GFG {
  
    public static int minNumber(int a[],
                           int n, int x)
    {
        int l = 0, h = 0, e = 0;
        for (int i = 0; i < n; i++)
        {
  
            // no. of elements equals to
            // x, that is, e.
            if (a[i] == x)
                e++;
  
            // no. of elements greater
            // than x, that is, h.
            else if (a[i] > x)
                h++;
  
            // no. of elements smaller
            // than x, that is, l.
            else if (a[i] < x)
                l++;
        }
  
        int ans = 0;
        if (l > h) 
            ans = l - h;
        else if (l < h) 
            ans = h - l - 1;
      
        // subtract the no. of elements 
        // that are equal to x.
        return ans + 1 - e;
    }
  
    // Driven Program
    public static void main(String[] args)
    {
        int x = 10;
        int a[] = { 10, 20, 30 };
        int n = a.length;
        System.out.println(
                      minNumber(a, n, x));
    }
}
  
// This code is contributed by 
// Prasad Kshirsagar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find minimum number 
# of elements to add so that its median 
# equals x.
  
def minNumber (a, n, x):
    l = 0
    h = 0
    e = 0
    for i in range(n):
      
        # no. of elements equals to x,
        # that is, e.
        if a[i] == x:
            e+=1
          
        # no. of elements greater than x,
        # that is, h.
        elif a[i] > x:
            h+=1
          
        # no. of elements smaller than x,
        # that is, l.
        elif a[i] < x:
            l+=1
      
    ans = 0;
    if l > h:
        ans = l - h
    elif l < h:
        ans = h - l - 1;
      
    # subtract the no. of elements 
    # that are equal to x.
    return ans + 1 - e
  
# Driver code
x = 10
a = [10, 20, 30]
n = len(a)
print(minNumber(a, n, x))
  
# This code is contributed
# by "Abhishek Sharma 44"

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find minimum 
// number of elements to add 
// so that its median equals x.
using System;
  
class GFG 
{
public static int minNumber(int []a,
                            int n, 
                            int x)
{
    int l = 0, h = 0, e = 0;
    for (int i = 0; i < n; i++)
    {
  
        // no. of elements 
        // equals to x,
        // that is, e.
        if (a[i] == x)
            e++;
  
        // no. of elements 
        // greater than x,
        // that is, h.
        else if (a[i] > x)
            h++;
  
        // no. of elements smaller
        // than x, that is, l.
        else if (a[i] < x)
            l++;
    }
  
    int ans = 0;
    if (l > h) 
        ans = l - h;
    else if (l < h) 
        ans = h - l - 1;
  
    // subtract the no. 
    // of elements that
    // are equal to x.
    return ans + 1 - e;
}
  
// Driver Code
public static void Main()
{
    int x = 10;
    int []a = {10, 20, 30};
    int n = a.Length;
    Console.WriteLine(
                minNumber(a, n, x));
}
}
  
// This code is contributed
// by anuj_67.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find minimum 
// number of elements to add so  
// that its median equals x.
  
function minNumber($a, $n, $x)
{
    $l = 0; $h = 0; $e = 0;
    for ($i = 0; $i < $n; $i++)
    {
  
        // no. of elements equals  
        // to x, that is, e.
        if ($a[$i] == $x)
            $e++;
  
        // no. of elements greater
        // than x, that is, h.
        else if ($a[$i] > $x)
            $h++;
  
        // no. of elements smaller 
        // than x, that is, l.
        else if ($a[$i] < $x)
            $l++;
    }
  
    $ans = 0;
    if ($l > $h
        $ans = $l - $h;
    else if ($l < $h
        $ans = $h - $l - 1;
      
    // subtract the no. of elements 
    // that are equal to x.
    return $ans + 1 - $e;
}
  
// Driver code
$x = 10;
$a = array (10, 20, 30);
$n = sizeof($a) ;
echo minNumber($a, $n, $x), "\n";
  
// This code is contributed by jit_t
?>

chevron_right



Output :

1

Time complexity : O(n)

This article is contributed by Sagar Shukla. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up