Leetcode【347、378、451、692】

问题描述:【Heap】347. Top K Frequent Elements
解题思路:

给一个整数数组,返回最常出现的 k 个元素。

一般情况下,求前 k 个元素的题目可以使用堆求解。但是如果先进行堆排序(O(n*logn)),再输出前 k 个元素,这样时间复杂度和普通排序方法 sorted() 没有区别。

对于求前 k 个元素,实际上我们只需要维护大小为 k 的堆长度即可。当我们的堆达到 k 个元素后,剩下的元素和堆顶的元素比较,如果其出现次数大于堆顶元素,则替换堆顶元素。因为只维护了 k 大小的堆,这种做法的时间复杂度为 O(n*logk)。但是,如果 k = n,时间复杂度还会退化成 O(n*logn)。

Python3 实现:
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        heap = []
        for num, cnt in collections.Counter(nums).items():
            if len(heap) < k:  # 只维护大小为k的堆
                heapq.heappush(heap, (cnt, num))
            elif cnt > heap[0][0]:  # 达到k后,后面的元素和堆顶元素比较
                heapq.heapreplace(heap, (cnt, num))
        ans = []
        while len(heap) > 0:  # 输出堆中前k个元素(从小到大)
            ans.append(heapq.heappop(heap)[1])
        return ans

一种 Pythonic 的写法,即利用 collections.Counter(list).most_common(k) 返回前 k 大元素。

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        return [i[0] for i in collections.Counter(nums).most_common(k)]

问题描述:【Sort】378. Kth Smallest Element in a Sorted Matrix
解题思路:

这道题是给一个 n*n 矩阵,每行每列都是升序,求第 k 小元素。

先排序,再输出。时间复杂度 O((n^2) * (log (n^2))。实际上也可以使用 Leetcode 347 中的方法进行堆排序。

Python3 实现:
class Solution:
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
        N = len(matrix)
        return sorted([matrix[i][j] for i in range(N) for j in range(N)])[k-1]

问题描述:【Sort】451. Sort Characters By Frequency
解题思路:

这道题是给一个字符串,按照字母次数降序排列。

做法很直接,统计每个单词出现的次数,然后使用 sorted() 从大到小排序即可。

Python3 实现:
class Solution:
    def frequencySort(self, s: str) -> str:
        dic = collections.Counter(s)
        li = sorted(dic.items(), key=lambda x: x[1], reverse=True)  #按照次数从大到小排序
        ans = ""
        for item in li:
            ans += item[0] * item[1]
        return ans

问题描述:【Heap】692. Top K Frequent Words
解题思路:

这道题是给一个单词数组,返回出现次数最多的前 k 个单词。如果次数相同,返回字典序较小的单词。

这道题和 Leetcode 347 类似,但是不同之处在于次数相同时要输出字典序较小的单词。如果使用 sorted() 或者 Counter(words).most_common(k) 方法,均不能实现次数相同输出较小字典序的单词。但是,使用 heapq.nsmallest(k, list) 可以实现这个功能。

时间复杂度为建堆时产生的 O(n*logn)。

Python3 实现:
class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        heap = []
        for word, cnt in collections.Counter(words).items():
            heapq.heappush(heap, (-cnt, word))  # 负值表示建立小根堆
        return [h[1] for h in heapq.nsmallest(k, heap)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,517评论 0 13
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,814评论 0 1
  • 简单排序 插入排序 想象一下插队的过程... 一个人通过插队的方式排到前面,而将原本在他前面的人挤到了后面的位置。...
    Kasheem_Lew阅读 1,380评论 0 4
  • 作者:大海里的太阳原文地址:http://www.cnblogs.com/wxisme/ 前言 查找和排序算法是算...
    IT程序狮阅读 2,432评论 0 63
  • 除夕夜显得很安静,没有往年那么热闹。鞭炮声少了很多,说实在的;我也不喜欢鞭炮声持续太久,意思意思即可。 早上,爸爸...
    嘻嘻frighting阅读 188评论 0 1