前几天开始做这道题,可是那几天情绪低落,没有状态,今天调整好了,就继续研究一下这道题,话不多说,先上题目
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]则中位数是 2.0
示例 2:nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这题一看到的时候就想用二元归并的方法,因为最近正好有看到这个,啊哈哈哈,直接上PHP版的代码
function findMedianSortedArrays($nums1, $nums2) {
$i = $j = 0;
$len1 = count($nums1);
$len2 = count($nums2);
$len = $len1 + $len2;
$flag = $len % 2;
if($flag == 0)
{
$middlePos = $len / 2;
}else{
$middlePos = ceil($len / 2);
}
$arr = [];
$middleNum = 0;
while($i < $len1 || $j < $len2)
{
if($nums1[$i] <= $nums2[$j])
{
// 加判断是为了判断是否先遍历完了某个数组
if($i == $len1)
{
$arr[] = $nums2[$j];
$j++;
}else{
$arr[] = $nums1[$i];
$i++;
}
}
else
{
// 加判断是为了判断是否先遍历完了某个数组
if($j == $len2)
{
$arr[] = $nums1[$i];
$i++;
}else{
$arr[] = $nums2[$j];
$j++;
}
}
if($flag == 0)
{
// 还要往后取一位
if(count($arr) == $middlePos + 1)
{
$middleNum = ($arr[ $middlePos - 1 ] + $arr[ $middlePos ]) / 2;
break;
}
}else{
// 等于中位数
if(count($arr) == $middlePos)
{
$middleNum = $arr[ $middlePos - 1 ];
break;
}
}
}
return $middleNum;
}
但是后面看了题解,说折半删除法是更优解,可是博主才疏学浅,需要时间来消化一下,后面再补上这算法。大佬们如果懂的话请不吝赐教,蟹蟹。