统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素
個(gè)人網(wǎng)站:https://www.cxyxiaowu.com
今天分享的題目來(lái)源于 LeetCode 上第 347 號(hào)問(wèn)題:前 K 個(gè)高頻元素。題目難度為 Medium,目前通過(guò)率為 56.9% 。
題目描述
給定一個(gè)非空的整數(shù)數(shù)組,返回其中出現(xiàn)頻率前 k 高的元素。
示例 1:
輸入: nums = [1,1,1,2,2,3], k = 2 輸出: [1,2]示例 2:
輸入: nums = [1], k = 1 輸出: [1]說(shuō)明:
- 你可以假設(shè)給定的 k 總是合理的,且 1 ≤ k ≤ 數(shù)組中不相同的元素的個(gè)數(shù)。
- 你的算法的時(shí)間復(fù)雜度必須優(yōu)于 O(n log n) , n 是數(shù)組的大小。
題目解析
解法一:粗暴排序法
最簡(jiǎn)單粗暴的思路就是 使用排序算法對(duì)元素按照頻率由高到低進(jìn)行排序,然后再取前 k 個(gè)元素。
以下十種排序算法,任你挑選!
可以發(fā)現(xiàn),使用常規(guī)的諸如 冒泡、選擇、甚至快速排序都是不滿足題目要求,它們的時(shí)間復(fù)雜度都是大于或者等于 O(n log?n) ,而題目要求算法的時(shí)間復(fù)雜度必須優(yōu)于 O(n log n) 。
復(fù)雜度分析
- 時(shí)間復(fù)雜度:O(nlogn),n 表示數(shù)組長(zhǎng)度。首先,遍歷一遍數(shù)組統(tǒng)計(jì)元素的頻率,這一系列操作的時(shí)間復(fù)雜度是 O(n);接著,排序算法時(shí)間復(fù)雜度為O(nlogn) ;因此整體時(shí)間復(fù)雜度為 O(nlogn) 。
- 空間復(fù)雜度:O(n),最極端的情況下(每個(gè)元素都不同),用于存儲(chǔ)元素及其頻率的 Map 需要存儲(chǔ) n 個(gè)鍵值對(duì)。
解法二:最小堆
題目最終需要返回的是前 k 個(gè)頻率最大的元素,可以想到借助堆這種數(shù)據(jù)結(jié)構(gòu),對(duì)于 k 頻率之后的元素不用再去處理,進(jìn)一步優(yōu)化時(shí)間復(fù)雜度。
具體操作為:
- 借助 哈希表 來(lái)建立數(shù)字和其出現(xiàn)次數(shù)的映射,遍歷一遍數(shù)組統(tǒng)計(jì)元素的頻率
- 維護(hù)一個(gè)元素?cái)?shù)目為 k 的最小堆
- 每次都將新的元素與堆頂元素(堆中頻率最小的元素)進(jìn)行比較
- 如果新的元素的頻率比堆頂端的元素大,則彈出堆頂端的元素,將新的元素添加進(jìn)堆中
- 最終,堆中的 k 個(gè)元素即為前 k 個(gè)高頻元素
代碼如下:
class復(fù)雜度分析
- 時(shí)間復(fù)雜度:O(nlogk), n 表示數(shù)組的長(zhǎng)度。首先,遍歷一遍數(shù)組統(tǒng)計(jì)元素的頻率,這一系列操作的時(shí)間復(fù)雜度是 O(n);接著,遍歷用于存儲(chǔ)元素頻率的 map,如果元素的頻率大于最小堆中頂部的元素,則將頂部的元素刪除并將該元素加入堆中,這里維護(hù)堆的數(shù)目是 k ,所以這一系列操作的時(shí)間復(fù)雜度是 O(nlogk)的;因此,總的時(shí)間復(fù)雜度是 O(nlog?k) 。
- 空間復(fù)雜度:O(n),最壞情況下(每個(gè)元素都不同),map 需要存儲(chǔ) n 個(gè)鍵值對(duì),優(yōu)先隊(duì)列需要存儲(chǔ) k個(gè)元素,因此,空間復(fù)雜度是 O(n)。
解法三:桶排序法
首先依舊使用哈希表統(tǒng)計(jì)頻率,統(tǒng)計(jì)完成后,創(chuàng)建一個(gè)數(shù)組,將頻率作為數(shù)組下標(biāo),對(duì)于出現(xiàn)頻率不同的數(shù)字集合,存入對(duì)應(yīng)的數(shù)組下標(biāo)即可。
代碼實(shí)現(xiàn)如下:
//基于桶排序求解「前 K 個(gè)高頻元素」復(fù)雜度分析
- 時(shí)間復(fù)雜度:O(n), n 表示數(shù)組的長(zhǎng)度。首先,遍歷一遍數(shù)組統(tǒng)計(jì)元素的頻率,這一系列操作的時(shí)間復(fù)雜度是 O(n);桶的數(shù)量為 n + 1,所以桶排序的時(shí)間復(fù)雜度為 O(n);因此,總的時(shí)間復(fù)雜度是 O(n)。
- 空間復(fù)雜度:很明顯為 O(n)
總結(jié)
以上是生活随笔為你收集整理的统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 导出参考文献是ciw格式_使用 EndN
- 下一篇: summary+plan