两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录

来源:互联网 发布:ubantu查看设备端口 编辑:程序博客网 时间:2024/05/18 00:33

1.长度相等的两个有序数组寻找上中位数

注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个)
思路:去掉不可能为上中位数的,剩下的简化组合求上中位数。

1.1 奇数序列

位置 位置 位置 位置 位置 1 2 3 4 5 1’ 2’ 3’ 4’ 5’

数字代表第几个数,求上中位数(第5小的数)

case1: 3=3’ 则3或者3’为上中位数
case2: 3>3’ 不可能为上中位数的为3(1 2 1’ 2’ 3’已经5个数比它小) 4 5 1’ 2’,可能的为1 2 3’ 4’ 5’
则这种情况下我们可以把这10个数简化为:

位置 位置 位置 1 2 3 3’ 4’ 5’

注:3已经不可能作为上中位数,但递归要求参数格式,加入凑格式,上下各传3个。

1.2 偶数序列

位置 位置 位置 位置 1 2 3 4 1’ 2’ 3’ 4’

数字代表第几个数,求上中位数(第4小的数)

case1: 2=2’ 则2或者2’为上中位数
case2: 2>2’ 不可能为上中位数的为3,4,1’,2’,可能的为1 2 3’ 4’
则这种情况下我们可以把这8个数简化为:

位置 位置 1 2 3’ 4’

注:递归结束条件 , 每个数组只剩下1个数,返回较小的。

2.长度不等的两个有序数组寻找合在一起后第k小的数,要求不合用二分解决(时间复杂度为O(log min(m,n) ),快速排序为O(log(m+n)))

case1: 长度为10和17的两个有序数组求第k小的数(1<=k<=10)

方法:两个数组取前k个数,转化为长度相等的两个有序数组寻找上中位数

case2: 长度为10和17的两个有序数组求第k小的数,如第25小的数(17< k<=27)。

方法:两个数组分别取后3个数,长度为10的数组淘汰7个数,长度为17的数组淘汰14个数,剩下的数取上中位数只能是第24(7+14+3)小的数。
这里写图片描述
附加单独判断第8个数和第15个数和另一个数组最大的数比较,若大于则这个数就是第25小的数.
这里写图片描述
否则扔掉这两个数,让剩下的4个数求上中位数。(转化为长度相等的两个有序数组寻找上中位数)(8[10淘汰]+15[17淘汰]+2[4选上中位数淘汰]=25)

位置 位置 9 10 16’ 17’

case3: 长度为10和17的两个有序数组求第k小的数,如第14小的数(10< k<=17)。

方法:取第一个数组全体和第二个数组一部分(淘汰前三个数和后三个数,单独比较第4个数,是返回,不是转化为:长度相等的两个有序数组寻找上中位数
这里写图片描述

3 专访ACM大神

阅读全文
0 0
原创粉丝点击