长度为n的数组中的中位数是一个元素,在我们按非降序对元素进行排序(数组元素从1开始编号)后,它占据位置编号(n + 1)/ 2。数组(2、6、1、2、3)的中位数是数字2,数组(0、96、17、23)的中位数是数字17。
例子 :
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.
第一种方法:-该方法是在数组中再加上一个数字x,直到数组的中位数等于x。下面是上述方法的实现:
C++
// C++ program to find minimum number
// of elements needs to add to the
// array so that its median equals x.
#include
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;
}
Java
// Java program to find minimum number
// of elements needs to add to the
// array so that its median equals x.
import java.util.Arrays;
class GFG
{
// Returns count of elements to be
// added to make median x. This function
// assumes that a[] has enough extra space.
static int minNumber(int a[], int n, int x)
{
// to sort the array in increasing order.
Arrays.sort(a);
int k;
for (k = 0; a[(n) / 2] != x; k++)
{
a[n++] = x;
Arrays.sort(a);
}
return k;
}
// Driver code
public static void main(String[] args)
{
int x = 10;
int a[] = { 10, 20, 30 };
int n = 3;
System.out.println(minNumber(a, n-1, x));
}
}
// This code has been contributed by 29AjayKumar
Python3
# Python3 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
C#
// C# program to find minimum number
// of elements needs to add to the
// array so that its median equals x.
using System;
class GFG
{
// Returns count of elements to be
// added to make median x. This function
// assumes that a[] has enough extra space.
static int minNumber(int []a, int n, int x)
{
// to sort the array in increasing order.
Array.Sort(a);
int k;
for (k = 0; a[(n) / 2] != x; k++)
{
a[n++] = x;
Array.Sort(a);
}
return k;
}
// Driver code
public static void Main(String[] args)
{
int x = 10;
int []a = { 10, 20, 30 };
int n = 3;
Console.WriteLine(minNumber(a, n-1, x));
}
}
// This code contributed by Rajput-Ji
PHP
Javascript
C++
// C++ program to find minimum number of
// elements to add so that its median
// equals x.
#include
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;
}
Java
// 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
Python3
# 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"
C#
// 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.
PHP
$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
?>
Javascript
输出 :
1
时间复杂度: O(knLogn)
第二种方法:-更好的方法是对所有等于x(即e),大于x(即h)且小于x(即l)的元素进行计数。然后 –
如果l大于h,则ans将为(l – h)+ 1 – e;
如果h大于l,则ans将为(h – l – 1)+ 1 – e;
我们可以使用Hoare的分区方案来计算较小,相等和较大的元素。
下面是上述方法的实现:
C++
// C++ program to find minimum number of
// elements to add so that its median
// equals x.
#include
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;
}
Java
// 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
Python3
# 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"
C#
// 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.
的PHP
$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
?>
Java脚本
输出 :
1
时间复杂度: O(n)