寻找两个正序数组的中位数

两个递增序列的中位数
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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值