在2个排序数组内找到第K小的元素

本文介绍了一个算法,该算法能够在两个已排序的整数数组中找到第K小的元素。通过递归地缩小搜索范围,有效地解决了这个问题。文章提供了一个C++实现示例。
/*
Find the k-th Smallest Element in the Union of Two Sorted Arrays
*/

#include <iostream>

int findKth(int a[], int m, int b[], int n, int k)
{
	int pa = m / (m + n) * k;
	int pb = k - pa - 1;

	int a_pa_1 = (pa == 0) ? INT_MIN : a[pa - 1];
	int b_pb_1 = (pb == 0) ? INT_MIN : b[pb - 1];
	int a_pa = (pa == m) ? INT_MAX : a[pa];
	int b_pb = (pb == n) ? INT_MAX : b[pb];

	if(a_pa > b_pb && a_pa_1 < b_pb) return b_pb;
	if(b_pb > a_pa && b_pb_1 < a_pa) return a_pa;

	if(a_pa > b_pb)
	{
		return findKth(a, pa, b + pb + 1, n - pb - 1, k - pb - 1);
	}
	else
	{
		return findKth(a + pa + 1, m - pa - 1, b, pb, k - pa - 1);
	}
};

int main()
{
    int A[] = {1, 8, 8, 10, 20};  
    int B[] = {5, 8, 8, 9, 22, 110};  
          
    int k = 7;  

	int res = findKth(A, 5, B, 6, k);

	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值