leetcode Median of Two Sorted Arrays

本文探讨如何在O(log(m+n))时间内找出两个已排序数组的中位数,通过逐步减小搜索范围来优化查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="color: inherit; font-family: inherit; line-height: 1.1; background-color: rgb(255, 255, 255);">Median of Two Sorted Arrays</span>

My Submissions
Total Accepted: 65547 Total Submissions: 383655 Difficulty: Hard

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Show Tags
Have you met this question in a real interview?

这题花费了我好久的时间,所以就写的详细一点吧。
问题是,在两个排好序的数组中,在时间为 O(log (m+n))内输出这两个数组的中位数。
思路:调用函数输出两个排好序数组中的第k小数。

首先
假如a数组为空,那么直接返回b数组第k小即可。同理,假如b数组为空。。。。。。

假如k==1的话,那么直接返回a,b数组第一个元素中小一点的那个就好。
 int halfk=k/2;
假如两个数组的长度都大于等于halfk,那么你比较数组中a[halfk]与b[halfk],如果a[halfk]小于b[halfk],那么数组a中的前halfk个必然是前k小的数中的一部分,然后更新a数组,使a数组成为a[halfk+1]开始的数组。反之,如果a[halfk]大于b[halfk],那么数组b中的前halfk个必然是前k小的数中的一部分,然后更新b数组,使b数组成为b[halfk+1]开始的数组。注意此处边界值的情况,假如数组的长度恰好等于halfk,那么数组更新后,其长度为0.


假如两个数组的长度不都大于halfk,例如a数组长度小于halfk,那么比较a数组最后一个数与b[haltk],那如果是小于的话,a数组的所有元素都在前k小,接着找b就好。

// test4MedianOfTwoSortedArr.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
using std::vector;

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2);
int findKthMin(vector<int>& nums1, vector<int>& nums2, int astart, int bstart, int k);
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> a= {2,3,4,5,6};
	vector<int> b= {1};
	double s = findMedianSortedArrays(a,b);
	return 0;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
{
	int m = nums1.size();
	int n = nums2.size();
	if ((m + n) % 2 == 0)
	{
		int temp1 = findKthMin(nums1, nums2, 0, 0, (m + n) / 2);
		int temp2 = findKthMin(nums1, nums2, 0, 0, (m + n) / 2 + 1);
		double s = temp1 + temp2;
		double result = s / 2;
		return result;
	}
	else
		return findKthMin(nums1, nums2, 0, 0, (m + n + 1) / 2);
}
int findKthMin(vector<int>& nums1, vector<int>& nums2, int astart, int bstart,int k)
{
	if (nums1.size() - astart == 0)
		return nums2[k - 1 + bstart];
	if (nums2.size() - bstart == 0)
		return nums1[k - 1 + astart];
	if (k == 1)
	{
		if (nums1[astart] < nums2[bstart])
			return nums1[astart];
		else
			return nums2[bstart];
	}
	int halfk = k / 2;
	if (nums1.size() - astart >= halfk && nums2.size() - bstart >= halfk)
	{
		if (nums1[halfk + astart - 1] <= nums2[halfk + bstart - 1])
		{
			if (nums1.size() - astart == halfk)
				return findKthMin(nums1, nums2, nums1.size(), bstart, k - halfk);//表示num1的所有的都包含在了前k小。
			else
				return findKthMin(nums1, nums2, astart + halfk, bstart, k - halfk);
		}
		else
		{
			if (nums2.size() - bstart == halfk)
				return findKthMin(nums1, nums2, astart, nums2.size(), k - halfk);
			else
				return findKthMin(nums1, nums2, astart, bstart + halfk, k - halfk);
		}

	}
	if (nums1.size() - astart < halfk)
	{
		if (nums1[nums1.size() - 1] < nums2[halfk + bstart - 1])
			return findKthMin(nums1, nums2, nums1.size(), bstart, k - (nums1.size() - astart));
		else
		{
			if (nums2.size() - bstart == halfk)
				return findKthMin(nums1, nums2, astart, nums2.size(), k - halfk);
			else
				return findKthMin(nums1, nums2, astart, bstart + halfk, k - halfk);
		}
	}
	if (nums2.size() - bstart < halfk)
	{
		if (nums2[nums2.size() - 1] < nums1[halfk + astart - 1])
			return findKthMin(nums1, nums2, astart, nums2.size(), k - (nums2.size()-bstart));
		else
		{
			if (nums1.size() - astart == halfk)
				return findKthMin(nums1, nums2, nums1.size(), bstart, k - halfk);
			else
				return findKthMin(nums1, nums2, astart + halfk, bstart, k - halfk);
		}
	}
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值