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