一题多解(五) —— topK(数组中第 k 大/小的数)
来源:互联网 发布:js if语句的嵌套 编辑:程序博客网 时间:2024/06/06 18:24
根据对称性,第 k 大和第 k 小,在实现上,是一致的,我们就以第 k 小为例,进行说明:
法 1
直接排序(sort(A, A+N)
),当使用一般时间复杂度的排序算法时,其时间复杂度为
法 2
先将 sort(A, A+k)
,则这些元素的最大值在第 k 个位置上。我们一个一个处理剩余的元素,当一个元素开始被处理时,它先于数组中第 k 个元素比较,
- 如果该元素大,不做任何处理,遍历下一个元素;
- 如果该元素小,则将该元素插入在前面合适的位置;
代码逻辑可参考 插入排序(insertion sort)
此时的时间复杂度为:
法 3:借助数据结构
优先队列,DeleteMin 执行 k-1 次,
法 4:借助快排的 partition 函数
根据 partition 函数返回值与 k 的关系,然后继续进行 partition:
int partition(int*A, int N, int s, int e) { if (!A || N <= 0 || s < 0 || e >= N) throw exception(""); int toSwap = s - 1; // 以最后一个元素作为 pivot,然后进行 for (int i = s; i < e; ++i) { if (A[i] < A[e]) { ++toSwap; if (toSwap != i) { swap(A[toSwap], A[i]); } } } ++toSwap; swap(A[toSwap], A[e]);}int topK (int*A, int N, int k) { int p = partition(A, N, 0, N-1); while (p != k-1) { p < k-1 ? p = partition(A, N, p+1, N-1) : p = partition(A, N, 0, p-1); } return A[p];}
0 0
- 一题多解(五) —— topK(数组中第 k 大/小的数)
- TopK问题——求数组中第K小的数
- TopK---返回第K小(大)的数字
- 矩阵topK 给一个矩阵,各行各列均有序,求第k小值。(k大的值)
- 数组中第k大的数
- 数组中第K大的数
- 数组中第K大的数
- 数组中第k小的数
- 数组中第K小的数
- 无序数组中找到第K小的数(或者找到最小的K个数)
- 求第K小/大的数(树状数组解法)
- 求第K小/大的数(树状数组解法)【续】
- 在一个数组中找到前k个小(大)的数
- 面试题—— 找出一个无序整型数组中第k大的数。
- 寻找无序数组中第k大的数——快排思想
- 003-20利用伴随数组解决在指定区间第k小(大)的数——重复查看,区间任意
- 每天一道算法题(32)——输出数组中第k小的数
- 求两个已排序的数组中所有元素的第K大(小)
- 个人理解的Android设计模式之观察者模式
- 多线程系列(一)
- Excel使用总结
- jdk1.8.0_73源码解读——ArrayList的实现
- 启动 Hadoop 集群时datanode节点不启动原因之一——格式化次数太多的解决办法
- 一题多解(五) —— topK(数组中第 k 大/小的数)
- Hibernate4自学入门(一)——初识Hibernate
- 根据文本内容调整Button大小
- Python3中urllib详细使用方法(header,代理,超时,认证,异常处理)
- 267_Gallery使用
- HTML初学
- Item6 Use the explicitly typed initializer idiom when auto deduces undesied types
- 2017爱奇艺校园招聘笔试题
- 第一次用不存在的海外版百度的高级搜索