这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30 y数组:3,5,8,11 则中间大数为:8
下面是我自己想的算法。
public class GetMiddleValue
{
public static void main(String[] args)
{
int[] a = {1, 7, 9, 10, 30};
int[] b = {3, 5, 8, 11};
getMiddleValue(a, b);
getMiddleValue2(a, b);
}
public static void getMiddleValue(int[] a, int[] b)
{
int n = (a.length + b.length + 1)/2;
int i = 0;
int j = 0;
int sum = 0;
int middle = 0;
boolean flag = true;
while(i < a.length && j < b.length)
{
if(a[i] <= b[j])
{
i++;
middle = a[i-1];
}
else
{
j++;
middle = b[j-1];
}
sum++;
if(sum == n)
{
System.out.println("The middle number is : " + middle);
flag = false;
break;
}
}
if(flag)
{
if(i == a.length)
{
while(sum < n)
{
j++;
sum++;
}
middle = b[j-1];
}
else
{
while(sum < n)
{
i++;
sum++;
}
middle = a[i-1];
}
System.out.println("The middle number is : " + middle);
}
}
public static void getMiddleValue2(int[] a, int[] b)
{
int n = (a.length + b.length + 1)/2;
int i = 0;
int j = 0;
int middle = 0;
while(i < a.length && j < b.length && n > 0)
{
if(a[i] <= b[j])
{
i++;
middle = a[i-1];
}
else
{
j++;
middle = b[j-1];
}
n--;
}
if(n == 0)
{
System.out.println("The middle number is : " + middle);
}
else
{
if(i == a.length)
{
while(n > 0)
{
j++;
n--;
}
middle = b[j-1];
}
else
{
while(n > 0)
{
i++;
n--;
}
middle = a[i-1];
}
System.out.println("The middle number is : " + middle); }
}
}
//算法说明
//若两个数组合并起来有奇数个数,如9个, 则第5个为中间那个数
//若两个数组合并起来有偶数个数,如10个,则第5个为中间那个数