LeetCode在线刷题--4. Median of Two Sorted Arrays

本文探讨了在两个已排序数组中寻找中位数的高效算法,通过使用二分查找思想,实现了O(log(m+n))的时间复杂度,提供了一个硬核的解决方案,并附带详细代码解析。

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

4. Median of Two Sorted Arrays

题目: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)).You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

思路:首先大致说一下题目的意思,题目中要求提供给你两个有序数组,在满足O(log(m+n))的时间复杂度条件下找到两个有序数组的所有数据中的中位数。看到题目后我陷入了深思。。。。。

做为一个算法小白,在面对O(log(m+n))的条件下,我首先想到的是二分查找、二叉树、堆排序这3方面。显然二叉树与堆排序在我理解下要首先构造出二叉树或堆结构,而这个构造过程就已经达不到O(log(m+n)),于是我看准二分查找。

作为一道LeetCode上分类为Hard的题目实属有不小的恐惧,于是我。。。呜呜呜,放弃了。在Discuss中看到大神们的神操作,我不禁甘拜下风,下面上代码并好好分析分析:

代码:

/*
*算法实现
*利用getkth来封装底层具体实现
*/
 public double findMedianSortedArrays(int[] A, int[] B) {
	 //确定出中位数定位出来的两个位置l,r(初始位置为1)
     int m = A.length, n = B.length;
	 int l = (m + n + 1) / 2;//中间偏左位置
	 int r = (m + n + 2) / 2;//中间偏右位置
	 return (getkth(A, 0, B, 0, l) + getkth(A, 0, B, 0, r)) / 2.0; //利用getkth找出l,r位置的数值
}

/*
*getkth方法
*采用递归,从二分查找的思路入手
*/
public double getkth(int[] A, int aStart, int[] B, int bStart, int k) {
	 //将特殊点列出来。
     if (aStart > A.length - 1) return B[bStart + k - 1];            
	 if (bStart > B.length - 1) return A[aStart + k - 1];                
	 if (k == 1) return Math.min(A[aStart], B[bStart]);

	 int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
	 if (aStart + k/2-1 < A.length) aMid = A[aStart + k/2-1 ]; 
	 if (bStart + k/2-1 < B.length) bMid = B[bStart + k/2-1 ];        
    //递归迭代
	 if (aMid < bMid) 
	   return getkth(A, aStart + k/2, B, bStart,   k - k/2); 
	 else 
	   return getkth(A, aStart,    B, bStart + k/2, k - k/2);
}

看了很多遍,总有种似懂非懂的感觉。看来还要些时日来琢磨。。

有理解透彻的大佬欢迎评论,定虚心求教!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值