在网上看了很多两个等长有序数组求中位数的文章,但我都觉得有点儿问题。等下会说我觉得问题在哪里。
先说下中位数定义:当数组元素个数为奇数个的时候,中位数就是中间的数字,比如数组[1,2,3,4,5],那么3就是中位数。如果数组元素个数为偶数个的时候,那么中间两个元素的平均值就是中位数的值,比如数组[1,2,4,5],那么中位数就是(2+4)/2=3.
定义清楚了下面就来说下两个等长数组求中位数的问题,为了简化问题,直接假设两个数组都按从小到大顺序排列好了。两个等长数组,那么总的元素个数肯定为偶数,那么结果就肯定是某两个数字的平均值。
求解方法基本都一样,就是用二分搜索的思路来做。假设有两个数组A,B,首先用两个指针a,b分别指向A,B中间的数字,然后比较这两个数字,假设a指向数字大于b的数字,那么结果肯定不在a指向数字的右边和b指向数字的左边。然后分别向左向右移动a,b两个指针,再次进行比较。就是二分搜索的思路。
然后说问题,在网上看了好多博客,求得的结果都是指针移动的最后结果是A中某一元素和B中某一元素一起作为结果。但我认为这是不对的,因为最终结果的两个数字完全可以在同一个数组中,假设有两个数组
A:1 2 7 9 10
B:3 4 5 6 8
合并后中位数应该是5 和 6,两个数都在数组B中,并不是A、B各一个数。
网上很多人写的迭代结束条件都是找到了a=b或者最后子数组长度都为1,我觉得结束条件应该是找到a=b或者数组长度为2。