面试题17.14.最小K个数
https://leetcode-cn.com/problems/smallest-k-lcci/solution/mian-shi-ti-1714zui-xiao-kge-shu-ji-chu-k9jd8/
难度:中等
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
提示:
输入:arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
这道题之所以定义为堆排序类型题,就是因为可以任意顺序返回。这里推排序有两种思路:
至于 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 = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
遇到重复数字求频率,首先要想到Counter计数原则,将当前的数组转换为hash表 num:frequency 的类型然后再做操作。即:dic = collections.Counter(nums)
分享两种方法(虽然面试官更希望你写第二种,但如果同时写出第一种,能展示出你对基础模块的掌握度):
使用sorted自带的排序和列表切片后返回,可以压缩到一行代码
这道题提及了任意顺序返回均可,那就可以通过使用堆的方法来解决了。这道题使用小根堆很方便。
类似的题目有:
面试题17.14.最小K个数
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:
输入: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]
欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。
有喜欢力扣刷题的小伙伴可以加我微信(King_Uranus)互相鼓励,共同进步,一起玩转超级码力!
我的个人博客:
https://qingfengpython.cn
力扣解题合集:
https://github.com/BreezePython/AlgorithmMarkdown
点击阅读原文,可以跳转力扣解题详情。