leetcode 692. 前K个高频单词

题目描述:
给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字母顺序 排序。

示例:输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。

卡点
1.不知道键值对可以存进堆里?
2.然后不知道堆里如何比较字母顺序

对于卡点1来说,堆不一定只能存一个数,可以放一个任何类型。这里就直接把键值对封装成一个对象放进去
对于卡点2来说,堆可以自定义比较大小的方式,然后python字符串之间用比较符实际上就是比较第一个字母的ASCII码大小,如

str1 = "abc"
str2 = "xyz"
str1>str2#返回true

题解1:哈希表+最小堆法。
看到前k个或者第k个就联想到堆,最后题目就是用哈希表+堆的方法,用最小堆的解法,始终让最小堆里保留k个元素,大于k了就把堆顶pop出去,这样能保证堆里面的都是最大的。最后把堆里元素取出然后翻转。

class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        #堆+哈希表
        #卡点:不知道键值对可以存进堆里? 然后不知道堆里如何比较字母顺序
        dict = {}
        for i in words:
            if i in dict:
                dict[i] = dict[i]+1
            else:
                dict[i]=1
        heap = []
        for key,value in dict.items():
            heapq.heappush(heap,Node(key,value))
            if len(heap) > k:
                heapq.heappop(heap)
        res = []
        while len(heap)>0:
            tmp = heapq.heappop(heap)
            res.append(tmp.key)
        res.reverse()
        return res
class Node:
    def __init__(self,key,value):
        self.key = key
        self.value = value
    def __lt__(self,other):
        return self.key> other.key if self.value==other.value else self.value<other.value

题解2:哈希表暴力遍历法,主要思路是将每个单词出现次数遍历出来,将单词作为key,出现次数作为value,形成哈希表。对哈希表按照value值大小,进行排序。取前k个单词即可。

class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        dict = {}
        for i in words:
            if i not in dict:
                dict[i] = 1
            else:
                dict[i] += 1
        sortlist = sorted(dict.items(),key=lambda x:(-x[1],x[0]))
        return [item[0] for item in sortlist][0:k]

lambda表达式中,冒号后的参数可以有两个,这种情况是 以第一个参数作为排序的优先规则,第二个参数是在第一个参数相同时使用(这是元组间比较大小的规则)

第一个参数为负,则从大到小排序;如果第一个参数相同,则直接按字典顺序排序(Python3中的字符串排序默认为字典序)

暴力解参考
sorted 使用 lambda 元组排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值