题目
这样一个算法题:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
举个例子来说:如果nums1=[1,3],nums2=[2],算法的输出结果是2.0000.
下面举的例子是nums1=[1,2,3,4,5,6,7,8],nums2=[9,10,11,12,13,14,15,16,17]
方法
粗暴的方法一
思路:合并两个数组,找到最中间的那个数
粗暴的方法二
思路:用两个指针,逐个扫描,谁小就移动谁,移动总元素个数的一半
方法三(第k小数解法)
将问题转化为寻找有序数组中的第k小的数(比如上面的例子里面有17个数,中位数应该是第九个,所以我们要寻找的就是第九个数)
思路:折半删除,寻找第k小的数
轮次 | k | k/2(向下取整) | 谁小 | 删除 |
---|---|---|---|---|
1 | 9 | 4 | A | A |
2 | 5 | 2 | A | A |
3 | 3 | 1 | A | A |
4 | 2 | 1 | A | A |
5 | 1 | 0 | 选择B首元素 |
所以经过这几轮找到了最终值