码迷,mamicode.com
首页 > 编程语言 > 详细

两个有序数组,找第k小的数//未完

时间:2020-01-28 14:14:52      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:数组   第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小的数//未完

标签:数组   第k小   说明   思路   代码   移动   amp   结束   有序数组   

原文地址:https://www.cnblogs.com/guoyu1/p/12237858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!