【leetcode】——从两个有序数组中寻找他们并集的第k小元素

题目

题目:There are two sorted arrays A and B 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)).

两个排好序的数组A,B,大小分别为m,n,找到两个数组中所有元素的中位数,要求时间复杂度为O(log(m+n))

这题更通用的形式是,给定两个已经排序好的数组,找到两者所有元素中第k 小的元素。
中位数定义:当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。

在这里我们先假设所有的数组都是升序排列

解题思路

最简单的思路

将两个有序数组重新排序到一个数组里面,然后直接输出中位数
时间复杂度:O(m+n)

不排序

这里k =(m+n)/2
所以我们可以不对所有元素进行排序,只求前k个元素。从A与B数组的第一个元素开始,i=0与j=0分别作为数组A、B的索引,同时用一个计数器来计数index = 0
伪码如下:
index=0;
while(index < = k){
i=0;j=0;
if(A[i] > B[j] ) j++,index++;
else if(A[i] < B[j]) i++,index++;
else if(A[i] == B[j]) i++,j++,index+ = 2;
}

二分

时间复杂度为O(log(m+n)),自然想到可能会用二分法

假设A 和B 的元素个数都大于k/2,我们将A 的第k/2 个元素(即A[k/2-1])和B 的第k/2个元素(即B[k/2-1])进行比较,有以下三种情况(为了简化这里先假设k 为偶数,所得到的结论对于k 是奇数也是成立的):
• A[k/2-1] == B[k/2-1]
• A[k/2-1] > B[k/2-1]
• A[k/2-1] < B[k/2-1]

如果A[k/2-1] < B[k/2-1],意味着A[0] 到A[k/2-1] 的肯定在A 与B 的所有元素的前k个元素的范围内,也就是说,A的前(k/2-1)个元素中不可能存在大

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值