求两个已排序的数组中所有元素的第K大(小)

本文介绍了如何高效地找出两个已排序数组合并后的第K大元素。通过两种不同的方法实现,包括线性时间和对数时间复杂度的解决方案,详细阐述了算法思路并提供了递归解法的源代码。

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

1.reference

Creative Commons
https://github.com/soulmachine/leetcode

2.解题思路

以下均假设A[0…m-1],B[0…n-1];

1)O(n)
假设A,B均以降序排列,声明两个指针p,q。p指向A[0], q指向B[0]。再来一个count=0,用来表示当前已经到第count大了。然后指针开始游,如果*p > *q,则p++, count++;如果*p < *q,则q++, count++;而如果相等,两个游标选一个走即可,同时count++。最后当count==k时,就找到了所有元素的第K大了。

2)O(log(n))
上面O(n)的做法是一个一个剪,而这里,就是一半一半地剪。为了方便理解,这里就是求两个数组的第K小元素(原理是一样的,第K小即为第(m+n-k)大嘛),且A,B均以升序排列。因为A, B数组均已排好序,所以有如下结论(假设K为偶数,奇数同理)。
1’ A[] 或 B[] 中有个为空,则直接B[k-1]或A[k-1];
2’ 假设m,n>=k/2 (如果不满足,则下标取自己的上限即可)

  • 1.A[k/2-1] < B[k/2-1]:删除A[0…k/2-1],第k小肯定不在里面。因为AUB之后,A[0…k/2-1]内的所有元素均在B[k/2-1]此元素之前,而两组数据个数总和才为k个。
  • 2.A[k/2-1] > B[k/2-1]:删除B[0…k/2-1],第k小肯定不在里面。理由同上。
  • 3.A[k/2-1] = B[k/2-1]:找到了第k小,即为A[k/2-1]=B[k/2-1]。

因此,由上述条件我们可以推出利用递归函数解决问题是极为方便的。递归过程及结束条件如下所示(设m < n,暂不防御型编程)

  • 1.如果m=0,则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值