标签:数组 第k小 说明 思路 代码 移动 amp 结束 有序数组
1、题目描述:a,b两个有序数组,找出第k小的数,logk,二分查找,1个小于怎么办?
2、思路:
对于数组A 、 B , 如果 B[pb] < A[pa] && B[pb] > A[pa - 1], 那么 B[pb] 一定是第 pa + pb + 1 小的数。比如数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110},pa = 2, pb = 1, 这时,(B[pb] = 9) < (A[pa] =10) && (B[pb] = 9) > (A[pa - 1] = 8) ,那么,B[pb] = 9 一定是第 pa+pb+1 = 4 小的数。
换一句话说,如果我们要找第 k 小的数,那么, pa + pb = k - 1。
而且,B[pb] < A[pa] && B[pb] > A[pa - 1] 或者 A[pa] < B[pb] && A[pa] > B[pb - 1] 中的其中一个必须成立。 如果不成立, 我们需要移动pa 和 pb 的位置来使得其中的一个式子成立 。这是本题算法的本质。
假如第k大的数在a中,设置a[mid],那么肯定有b[k-mid-1]<=a[mid]<=b[k-mid],这是由于a中已经有mid个元素<a[mid]了,则b中肯定还有k-mid - 1个元素小于a[mid],所以我们判断
若b[k-mid-2]<=a[mid]<=b[k-mid-1], 返回a[mid]
若a[mid] < b[k-mid-2] 说明a[mid]小于第k个元素值,a.low = a.mid + 1
若a[mid] > b[k-mid-1],说明a[mid]大于第k个元素值,a.high = a.mid - 1
结束条件为a.low > a.high 如果未找到,则假设存在于b中,再判断一次
3、代码:
标签:数组 第k小 说明 思路 代码 移动 amp 结束 有序数组
原文地址:https://www.cnblogs.com/guoyu1/p/12237858.html