两个递增序列的中位数
leetcode中的一题,开始做的时候就想到用二分法来处理,复杂度为log(m+n)考虑两个序列的总长度可能为偶数/奇数,因此想找到第k个数,以前好像做过类似于找第k个数的题,但是忘记了具体如何做的。
开始做的时候直接取选取的序列的中间数,然后比较舍去较小的那一半,后来发现考虑少了。然后看讨论区发现要找第k个,那么每次只能选择k/2的位置,不能选择中间位置。
思路基本是对的,但是具体实现好多细节还是没考虑到。
思路及参考
double findK(int k, vector<int> nums1, vector<int> nums2) {
int m = nums1.size();
int n = nums2.size();
int m1 = 0, m2 = 0;
int retNum = 0;
int b1 = 0, b2 = 0, e1 = m - 1, e2 = n - 1;
if (m == 0 || (n!=0 &&nums1[m - 1] < nums2[0])) {
if (k > m) return nums2[k - m - 1];
return nums1[k - 1];
}
if (n == 0 || nums1[0] > nums2[n - 1]) {
if (k > n)return nums1[k - n - 1];
return nums2[k - 1];
}
while (k) {
if (b1 == m)
return nums2[b2 + k - 1];
if (b2 == n)
return nums1[b1 + k - 1];
if (k == 1)
return min(nums1[b1], nums2[b2]);
m1 = min(b1 + k / 2 - 1, m - 1);
m2 = min(b2 + k / 2 - 1, n - 1);
if (nums1[m1] <= nums2[m2]) {
k -= m1 - b1 + 1;
b1 = m1 + 1;
}
else {
k -= m2 - b1 + 1;
b2 = m2 + 1;
}
}
return 0;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
if ((m + n) % 2) {
return findK((m + n + 1) / 2, nums1, nums2);
return 0;
}
else {
return (findK((m + n) / 2, nums1, nums2) + findK((m + n) / 2 + 1, nums1, nums2)) / 2;
return 0;
}
}