Top K 题目小结

1. 不管是一维数组还是二维或多维数组求第K小或第K大元素,如果数组是无序的,那么

求第K小的元素就用最大堆,

求第K大的元素就用最小堆。

如果是一维数组,时间复杂度是O(NlogK)。如果是二维数组,时间复杂度是O(MNlogK)。

LintCode 461: Kth Smallest Numbers in Unsorted Array_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客
注意,这里也可以是一个链表,或者M个链表,做法一样,时间复杂度也一样。

2. 不管是一维数组还是二维或多维数组求第K小或第K大元素,也可以用quick select算法。
数组不需要有序。
如果是一维数组,时间复杂度是O(N)。如果是二维数组,时间复杂度是O(MN)。

一维数组的quick select 见Lintcode 80 Median
LintCode 80: Median (QuickSelect经典题)_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客

注意,quick select不能用链表。

3. 如果一维数组是有序的,直接取第k个或第n-k个元素即可。
如果二维数组每个数组都是有序的,那么
求第K小的元素就用最小堆,
求第K大的元素就用最大堆。

如果是二维矩阵,时间复杂度是O(M+KlogM)。这里M是建堆复杂度。

二维数组的例子见Lintcode 1874 Kth Smallest Element in a Specific Array
LintCode 1874: Kth Smallest Element in a Specific Array_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客类似的是Merge K Sorted List 的例子
LintCode 104: Merge K Sorted Lists (经典题!)_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客


4. 如果二维数组行列都是有序的,那么
求第K小的元素用最小堆
求第K大的元素用最大堆
以求第K小的元素用最小堆为例,思路是先放matrix[0][0],即最小的那个元素,然后将其pop(),再把它的正下方和右边的那个元素放进堆,
因为这两个肯定是仅比top大的那两个最小的元素。如此反复,一共pop掉k-1次,并且每次pop掉top后都把它正下方和右方的元素加进来。
时间复杂度O(klogk)。因为循环k遍,每次往里放最多2个数,所以heap最大size是2k,放了最多2k次,pop了k此,时间复杂度O(klogk)。

例子见 LintCode 401. Kth Smallest Number in Sorted Matrix 
LintCode 401. Kth Smallest Number in Sorted Matrix (堆经典好题!!!)_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客

注意: 如果行列都是有序,找某个数可以用O(m+n)的线性方法解决,即把开始的点放在右上或左下,然后线性查找。

注意:这种行列皆有序的矩阵,如果是找某个数的话,从右上或左下的顶点开始找就可以,线性查找,时间复杂度O(n)。
LeetCode - The World's Leading Online Programming Learning Platform

5. 如果是求前K个most frequent的元素呢?光MaxHeap或MinHeap还不行,因为我们要记录每个元素的frequency。
一个方法是Unordered_map + MaxHeap
另一个方法是Unordered_map + MinHeap

LintCode 1281: Top K Frequent Elements (堆经典题)_纸上得来终觉浅 绝知此事要躬行的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值