给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 这个题
时间: 2024-05-19 11:13:38 浏览: 70
寻找两个正序数组的中位数1
是经典的寻找两个有序数组的中位数问题,可以使用二分查找来解决。
首先,我们可以将问题转化为寻找第 k 小的数,其中 k 为两个数组的长度之和除以 2,即 k = (m+n) // 2。如果 m+n 为奇数,则中位数为第 k 小的数;如果 m+n 为偶数,则中位数为第 k 小的数和第 k+1 小的数的平均值。
假设我们要寻找第 k 小的数,我们可以分别在 nums1 和 nums2 中查找第 k//2 小的数,比较它们的大小。如果 nums1[k//2-1] < nums2[k//2-1],那么 nums1 中的前 k//2 个数一定在前 k 小的数中,可以把它们全部排除。因为我们要找的是第 k 小的数,所以我们只需要在剩余的 nums1 和 nums2 数组中寻找第 k-k//2 小的数即可。如果 nums1[k//2-1] > nums2[k//2-1],同理可以排除 nums2 中的前 k//2 个数。如果 nums1[k//2-1] == nums2[k//2-1],那么这个数就是第 k 小的数。
具体实现时,我们需要考虑边界问题。如果有一个数组为空,则直接返回另一个数组的第 k 小的数。如果 k=1,则返回两个数组的第一个数中较小的那个。如果 nums1 或 nums2 的长度不足 k//2,则直接返回另一个数组中的第 k-k//2 小的数。
代码如下:
阅读全文