数据结构与算法:top K 问题

news/2024/7/4 13:20:30

文章目录

    • 1. 找到数组中最小的 k 个数
      • 1.1 快排,O(nlogn),O(logn)
      • 1.2 大根堆,O(nlogk),O(k)

top K 问题是面试中常考的问题,往往可以用排序(排序)和堆(大/小根堆)来解决。当然,如果你只会快排的话,就可以早点面试结束回家吃饭了。

结论:

top K 问题常用堆来解决

1. 找到数组中最小的 k 个数

题目:

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

1.1 快排,O(nlogn),O(logn)

最容易想到的方法是快速排序,其时间复杂度为 O(nlogn),空间复杂度为 O(logn)

code:

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        arr.sort()
        return arr[:k]

1.2 大根堆,O(nlogk),O(k)

我们用一个大根堆实时维护数组的前 k 小值。首先将前 k 个数插入大根堆中,随后从第 k+1 个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入当前遍历到的数。最后将大根堆里的数存入数组返回即可。

由于 Python 中的 heapq库创建的堆为小根堆,因此我们要对数组中所有的数取其相反数变成大根堆。

code:

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        if not arr or k==0:
            return []
        heap=[-x for x in arr[:k]]
        heapq.heapify(heap)
        for x in arr[k:]:
            if -heap[0]>x:
                heapq.heappop(heap)
                heapq.heappush(heap,-x)
        return [-x for x in heap]

复杂度分析:

  • 时间复杂度:O(nlogk),其中 n 是数组 arr 的长度。由于大根堆实时维护前 k 小值,所以插入删除都是 O(logk) 的时间复杂度,最坏情况下数组里 n 个数都会插入,所以一共需要 O(nlogk) 的时间复杂度。
  • 空间复杂度:O(k),因为大根堆里最多有 k 个数

相关题目持续更新中 …


http://www.niftyadmin.cn/n/4775258.html

相关文章

Seven Years

这是最大的极限了。 365*7 先 做到不"一曝十寒" . 推荐个文章.都怪眼瞎啊 今年是看书看得最多的一年,,,,鬼知道生活对我这个AI干了什么,大一都不看PDF的,纸质书也不看,大二可以容忍看10页的PDF了,大三因为准备软考可以看40页了不能再多了,今年竟然可以看完100-3…

chrome console js多行输入

一直以来,Chrome控制台都缺少象IE调试台那样的多行执行模式。 今天意外发现Chrome其实也支持多行模式。默认在Chrome控制台上输入回车后会执行该命令,只需要通过输入ShiftEnter来新建行即可。

Python自学之路-list、tuple、dict和set

上一篇「Python自学之路-数据类型和变量」主要简单说明了下数据类型和变量,这一篇主要和大家介绍下**list、tuple、dict和set。**相信后期在实战中会经常用到。 一、list Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随…

bWAPP(A8~CSRF)

A8 - Cross-Site Request Forgery CSRFCross-Site Request Forgery (Change Secret)Cross-Site Request Forgery (Change Secret)Cross-Site Request Forgery (Transfer Amount)Cross-Site Request Forgery (Change Secret) CSRF,全称Cross-site request forgery&am…

注解反射

/* 下面都很直白(low 不专业) 用最简单的东西描述完注解反射 如有错 你们去找我java老师算账吧 是他教的问题 就是这样。 知道或者了解一下注解 反射还是很有助于java框架学习的(我觉得是的)。注解反射应用上是框架…

Python自学之路-requests使用总结

(一)背景 学习Python有三周了,虽然由于工作、家庭原因,学习的时间不够多,但还是尽量去争取点时间去学习,最近的工作中,如果有时间,有条件的话,都会摸索着使用Python去解…

Coder fresher 要知道底层么

其实我从前是非常一股脑赞成那种“我们必须知道底层”这种观点的。总觉得程序员知道底层才有前途,才好装,才算大佬,还有就是别人巴拉巴拉 操作系统编译原理计算机网络名词蹦出来,你什么都不会 好丢脸,最明显例子就是大…

Python自学之路-内置函数说明及实例(一)

这篇主要整理下Python中的内置函数说明和实际用法,希望对新手有帮助。「其中一部分,有时间会继续整理」 **1.abs() ** 对传入参数取绝对值 2.all(iterable) 说明:参数iterable:可迭代对象; 如果iterable的所有元素不为0、’’…