341,前 K 個高頻元素

2021-03-02 數據結構和算法

給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]

示例 2:

輸入: nums = [1], k = 1
輸出: [1]

答案:

1public List<Integer> topKFrequent(int[] nums, int k) {
2    List<Integer>[] bucket = new List[nums.length + 1];
3    Map<Integer, Integer> frequencyMap = new HashMap<>();
4    for (int n : nums) {
5        frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
6    }
7    for (int key : frequencyMap.keySet()) {
8        int frequency = frequencyMap.get(key);
9        if (bucket[frequency] == null) {
10            bucket[frequency] = new ArrayList<>();
11        }
12        bucket[frequency].add(key);
13    }
14    List<Integer> res = new ArrayList<>();
15    for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
16        if (bucket[pos] != null) {
17            res.addAll(bucket[pos]);
18        }
19    }
20    return res;
21}

解析:

frepuencyMap中的key是數組中元素,value是數組中元素的個數。代碼比較簡單,很容易理解,但由於題目沒有說清楚,導致算法可能有些不嚴謹,比如數組【1,1,2,2,3】,我們如果求前2高的元素,結果為【1,2】,但如果是求前1高的元素,那麼就會有兩種選擇,要麼是1,要麼是2,當上面解法會把1,2都包含,假如我們只要1,或者2種的一個,我們就要這樣寫

1public List<Integer> topKFrequent(int[] nums, int k) {
2    List<Integer>[] bucket = new List[nums.length + 1];
3    Map<Integer, Integer> frequencyMap = new HashMap<>();
4    for (int n : nums) {
5        frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
6    }
7    for (int key : frequencyMap.keySet()) {
8        int frequency = frequencyMap.get(key);
9        if (bucket[frequency] == null) {
10            bucket[frequency] = new ArrayList<>();
11        }
12        bucket[frequency].add(key);
13    }
14    List<Integer> res = new ArrayList<>();
15    for (int pos = bucket.length - 1; pos >= 0; pos--) {
16        if (bucket[pos] != null) {
17            for (int i = 0; i < bucket[pos].size() && res.size() < k; i++)
18                res.add(bucket[pos].get(i));
19        }
20    }
21    return res;
22}

把上面15-19行的代碼換成下面15-20行的代碼即可。

相關焦點

  • leetcode-347前K個高頻元素
    347前K個高頻元素 https://leetcode-cn.com/problems/top-k-frequent-elements/1、題目描述給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。
  • 詳解一道高頻算法題:數組中的第 K 個最大元素
    今天分享的題目來源於 LeetCode 第 215 號問題,是面試中的高頻考題。在 未排序 的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
  • top k frequent words(前K個高頻單詞)
    問題給一非空的單詞列表,返回前 k 個出現次數最多的單詞。返回的答案應該按單詞出現頻率由高到低排序。
  • leetcode-378有序矩陣中第 K 小的元素
    ,其中每行和每列元素均按升序排序,找到矩陣中第 k 小的元素。請注意,它是 排序後 的第 k 小元素,而不是第 k 個 不同 的元素。0];            }        );        int n = matrix.length;        for(int i = 0; i < n; i++) {            queue.offer(new int[]{matrix[i][0],i,0});        }        //歸併N路取前k
  • 漫畫:美團面試題(TOPK:求第K個最大的元素)
    這個題目的變形很多,比如找 "前 K 個高頻元素"、 "數據流中的第K大元素" 、"最接近原點的 K 個值" 等等等等。第215題:在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
  • LeetCode Top 100 高頻算法題 23. Merge k Sorted Lists
    今日推薦:LeetCode Top 100高頻算法題
  • 考研英語 | 近五年考研英語試題出現過的 632 個高頻詞彙(4)
    考研英語試題對於我們整個英語複習的過程都起著一個重要的嚮導作用,可以根據試題來了解考研英語的常考題型和高頻詞彙
  • 570個高頻託福詞彙一覽表(101-200)
    這裡小編為大家整理了託福考試高頻詞彙570個,大家一起來學習一下吧。 這裡整理了570個託福詞彙當中的101-200個託福詞彙,還附有音標,更好的幫助大家記憶。kn'v:s] a.相反的 131. convert [kn'v:t] v.轉化 132. convince [kn'vins] v.使確信 133. cooperate [ku'preit] v.合作 134. coordinate [ku':dinit, ku':dineit] a.同等的 v.使協調 135. core [k:
  • 570個高頻託福詞彙一覽表(1-100)
    下面新東方網為大家帶來570個高頻託福詞彙一覽表(1-100)。希望可以幫助大家更好的備考託福,下面一起來看一下吧!   這裡整理了570個託福詞彙當中的前1-100個託福詞彙,還附有音標,更好的幫助大家記憶。
  • 算法雜貨鋪——k均值聚類(K-means)
    本文首先介紹聚類的基礎——距離與相異度,然後介紹一種常見的聚類算法 ——k均值和k中心點聚類,最後會舉一個實例:應用聚類方法試圖解決一個在體育界大家頗具爭議的問題——中國男足近幾年在亞洲到底處於幾流水平。4.2、相異度計算      在正式討論聚類前,我們要先弄清楚一個問題:如何定量計算兩個可比較元素間的相異度。
  • LeetCode-23.合併K個排序鍊表(Merge k Sorted Lists)
    這是前面Merge Two Sorted Lists的一個follow-up排序超大數量級的數據,可以分成N個機器分別排序
  • K Closest Points to Origin 最接近原點的K個點
    Note:1<=K<=points.length<=10000-10000<points[i][0]<10000-10000<points[i][1]<10000這道題給了平面上的一系列的點,讓求最接近原點的K個點。基本上沒有什麼難度,無非就是要知道點與點之間的距離該如何求。
  • leetcode-215數組中的第K個最大元素
    215數組中的第K個最大元素 https://leetcode-cn.com/problems/kth-largest-element-in-an-array/1、題目描述在未排序的數組中找到第 k 個最大的元素。
  • 高考英語589個高頻詞彙(含音標)--下
    高考英語考試大綱雖然要求考生需要掌握3500個單詞,但是絕大多數單詞大家平時都認識。
  • 中考化學高頻考點-原子或離子的結構示意圖及元素周期表
    [考情剖析]此知識點是全國各地中考的高頻考點,主要考查內容有:①畫粒子的結構示意圖;②根據結構示意圖判斷粒子的化學性質、穩定性、化合價、得失電子、離子符號的書寫;③根據結構示意圖書寫化學式;④判斷結構示意圖的類型(原子或離子);⑤元素周期表及其方格所獲信息等。
  • 英語發音——高頻5000詞中的多音詞
    我將這些多音詞主要分成了四類,並按照重要性從表1到表4列了出來,單詞的順序是按照5000 list中的詞頻順序排的,高頻在前。在之前寫過的幾篇文章中,我好幾次提到Vocabulary.com。Vocabulary.com除了是一個背單詞的app外,還是一個很好用的網絡詞典,它為每個單詞給出的釋義很詳細,這裡我只介紹我如何使用它來確定多音詞。
  • 漫畫:刪去k個數字後的最小值
    /** * 刪除整數的k個數字,獲得刪除後的最小值 * @param num  原整數 * @param k  刪除數量 */public static/** * 刪除整數的k個數字,獲得刪除後的最小值 * @param num  原整數 * @param k  刪除數量 */public static
  • 新東方金凌虹:英語六級真題高頻詞彙之翻譯
    相關閱讀》》   新東方金凌虹:英語六級真題高頻詞彙之翻譯  >新東方金凌虹:英語六級真題高頻詞彙之聽力  新東方金凌虹:英語六級真題高頻詞彙之閱讀   六級翻譯真題高頻及關鍵詞<共33詞,含重複出現單詞>
  • ​LeetCode刷題實戰25:K 個一組翻轉鍊表
    今天和大家聊的問題叫做K 個一組翻轉鍊表,我們先來看題面:https://leetcode-cn.com/problems/reverse-nodes-in-k-groupGiven a linked list, reverse the nodes of a linked list k at a time and return its
  • 草案對第341條的解釋超出立法本意
    多位常委會委員建議對刑法第341條不作解釋。    刑法第341條有3個罪名,即非法獵捕、殺害珍貴、瀕危野生動物罪,非法收購、運輸、出售珍貴瀕危野生動物、珍貴瀕危野生動物製品罪和非法狩獵罪。草案規定,知道或者應當知道是國家重點保護的珍貴、瀕危野生動物及其製品,為食用或者其他用途而購買的,屬刑法第341條第一款規定的「非法收購國家重點保護的珍貴、瀕危野生動物及其製品的行為」。