寻找第K大的数


1,对于一个有序数组

则为第K个数,O(1)


2,对于一个无序数组

使用修改的快排划分算法,时间复杂度为O(n)


3,对于两个无序数组

合并(不是真的合并,只是看出一个数组),则时间复杂度为O(n+m)


4,对于两个有序(假设递增)数组

http://www.51nod.com/question/index.html#!questionId=217

在两个有序数组中进行二分搜索:时间复杂度为O(logn+logm)

先比较两个数组k/2的元素,如果相等,返回

否则较大的那个索引减去k/4,较小的那个索引加上k/4,继续比较。
这样不停二分下去,直至两边相等或索引达到了边界(0或k)。

5,对于一个行列都递增的二维矩阵n*m,查找中位数

http://zhiqiang.org/blog/science/computer-science/median-algorithm-of-ordered-matrix.html

使用类似Tarjan的线性中位数的方法,每次找每列中位数,然后找中位数的中位数,

之后可以删除前一半列的上半部分或者后一半列的下半部分,这样可以实现复杂性  O(nlog2n)  


6,一种特殊的二维矩阵,查找第K大数

http://www.51nod.com/question/index.html#!questionId=46

2个整数数组A,B,长度分别为m,n。从A,B中各选1个元素A[i],B[j],相加后得到C[i,j],

共有m*n种选择方式,对应m*n个数,求这m*n个数中第K大的数是多少?

时间复杂度为:O((m+n)*log(Max-Min))。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值