K个数、K个点、K个元素,3K堆排序,类比三解题!

简介: K个数、K个点、K个元素,3K堆排序,类比三解题!

面试题17.14.最小K个数


https://leetcode-cn.com/problems/smallest-k-lcci/solution/mian-shi-ti-1714zui-xiao-kge-shu-ji-chu-k9jd8/

难度:中等


题目:

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

提示:

  • 0 <= len(arr) <= 100000
  • 0 <= k <= min(100000, len(arr))


示例:

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


分析

这道题之所以定义为堆排序类型题,就是因为可以任意顺序返回。 这里推排序有两种思路:

  1. 小根堆:每次获取的数据都无脑入堆,然后最终将前K个数字返回
  2. 大根堆:仅维护K个长度的堆,由于python没有,需要入赋值,如果当前的数大于heap[0],则堆顶出堆,当前数入堆,最终返回。

至于 return sorted(arr)[:k] 的写法,面试时候不怕被打,你就这么写。


解题:

import heapq
class Solution:
    def smallestK(self, arr, k):
        if k == 0:
            return []
        hq = []
        for i in arr:
            if len(hq) < k:
                heapq.heappush(hq, -i)
            else:
                if hq[0] < -i:
                    heapq.heappop(hq)
                    heapq.heappush(hq, -i)
        return [-i for i in hq]


347.前K个高频元素


https://leetcode-cn.com/problems/top-k-frequent-elements/solution/347qian-kge-gao-pin-yuan-su-nei-zhi-han-zlfi7/

难度:中等


题目:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

提示:

  • 1 <= nums.length <= 10 ^ 5
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的


示例:

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]


分析


遇到重复数字求频率,首先要想到Counter计数原则,将当前的数组转换为hash表 num:frequency 的类型然后再做操作。

即: dic = collections.Counter(nums)

分享两种方法(虽然面试官更希望你写第二种,但如果同时写出第一种,能展示出你对基础模块的掌握度):


1.sorted方法

使用sorted自带的排序和列表切片后返回,可以压缩到一行代码


2.堆排序

这道题提及了任意顺序返回均可,那就可以通过使用堆的方法来解决了。这道题使用小根堆很方便。

类似的题目有:

面试题17.14.最小K个数


sorted解题:


from collections import Counter
class Solution:
    def topKFrequent(self, nums, k):
        return [x[0] for x in sorted(Counter(nums).items(),key = lambda x: x[1],reverse=True)[:k]]


堆排序解题:


from collections import Counter
import heapq
class Solution:
    def topKFrequent(self, nums, k):
        dic = Counter(nums)
        hp = []
        for num, req in dic.items():
            if len(hp) < k:
                heapq.heappush(hp, (req, num))
            else:
                if req > hp[0][0]:
                    heapq.heappop(hp)
                    heapq.heappush(hp, (req, num))
        return [x[1] for x in hp]


973.最接近原点的K个点


https://leetcode-cn.com/problems/k-closest-points-to-origin/solution/973zui-jie-jin-yuan-dian-de-kge-dian-pyt-4jro/

难度:中等


题目:

我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。

(这里,平面上两点之间的距离是欧几里德距离。)

你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。

提示:

  • 1 <= K <= points.length <= 10000
  • -10000 < points[i][0] < 10000
  • -10000 < points[i][1] < 10000


示例:

示例 1:
输入:points = [[1,3],[-2,2]], K = 1
输出:[[-2,2]]
解释: 
(1, 3) 和原点之间的距离为 sqrt(10),
(-2, 2) 和原点之间的距离为 sqrt(8),
由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。
我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
示例 2:
输入:points = [[3,3],[5,-1],[-2,4]], K = 2
输出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也会被接受。)


分析

遇到求前K的题目,内置的sorted和堆排序无脑安排上就对了,类似的题目有:

这道题同样的,我们使用堆排序(大根堆)来完成解题,维护一个K大的堆,然后每次判断距离是否比堆顶的数字大。

如果比堆顶数字大,弹出堆顶,将当前距离及点信息以列表方式入堆即可。


解题:

import heapq
class Solution:
    def kClosest(self, points, k):
        hp = []
        for point in points:
            distance = sum(map(lambda x: abs(x ** 2), point))
            if len(hp) < k:
                heapq.heappush(hp, [-distance, point])
            else:
                if -distance > hp[0][0]:
                    heapq.heappop(hp)
                    heapq.heappush(hp, [-distance, point])
        return [point for distance, point in hp]




相关文章
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
496 2
基于Redis的高可用分布式锁——RedLock
|
人工智能 算法 安全
详解贪心算法
详解贪心算法
|
Oracle Java 关系型数据库
实时计算 Flink版操作报错合集之本地打成jar包,运行报错,idea运行不报错,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
271 6
|
项目管理
「软件项目管理」一文浅谈软件项目风险计划
该文章深入探讨了软件项目风险计划的制定,包括风险识别、评估、应对策略等内容,并提供了风险条目检查表、风险概率及影响分析矩阵等工具,帮助项目管理者有效地管理和减轻项目中的潜在风险。
「软件项目管理」一文浅谈软件项目风险计划
|
存储 监控 安全
网络钓鱼:识别与防范技巧
网络钓鱼:识别与防范技巧
712 1
|
Go vr&ar 图形学
重塑体验:AR/VR技术在游戏与娱乐行业的创新应用
【10月更文挑战第29天】本文探讨了AR/VR技术如何改变游戏与娱乐行业,介绍了AR和VR的基本概念及其在游戏和娱乐中的应用实例,包括《精灵宝可梦GO》的AR开发和VR视频播放器的实现代码,并展望了未来的发展趋势。
830 2
|
Java API 数据安全/隐私保护
如何在Java中处理InvalidKeyException异常?
如何在Java中处理InvalidKeyException异常?
|
程序员
聊聊 CTO 和 技术总监的区别
聊聊 CTO 和 技术总监的区别
1326 0
|
负载均衡 安全 Cloud Native
云上负载均衡:构建高可用、高性能的网络应用架构
与云原生技术深度融合:随着云原生技术的普及和发展未来的云上负载均衡将更加紧密地与云原生技术相结合。例如与Kubernetes等容器编排平台集成实现自动化的服务发现和路由管理;与Serverless架构结合提供无缝的流量接入和请求处理能力。 安全性能提升:面对日益严峻的网络安全威胁云上负载均衡将更加注重安全性能的提升。通过引入加密传输、访问控制、DDoS防护等安全措施确保网络流量的安全性和隐私性;同时还将建立完善的安全监控和应急响应机制以应对各种安全事件和突发事件。 支持多协议和多场景:未来的云上负载均衡将支持更多种类的网络协议和应用场景以满足不同用户和业务的需求。例如支持HTTP/2、
522 0
|
监控 安全 数据管理
管理员工上网,这三款上网行为管理软件帮你搞定
企业管理者可借助WorkWin、Net Nanny和WebWatcher等上网行为管理软件提升员工工作效率。这些工具能监控员工行为,保护公司知识产权,细化权限管理,防止数据泄露,优化时间分配,支持移动部署,确保工作安全,并通过USB管理和带宽控制强化网络安全。实时监控和远程管理则加速问题解决,促进团队协作。Net Nanny和WebWatcher提供过滤、监控及易用的管理界面,助力企业有效管理员工上网行为。
418 1

热门文章

最新文章