中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用heap和map

發布時間:2021-12-30 09:23:55 來源:億速云 閱讀:155 作者:iii 欄目:大數據

這篇文章主要講解了“怎么使用heap和map”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么使用heap和map”吧!

Top K 問題是面試中非常常考的算法題。

Leetcode 上這兩題大同小異,這里以第一題為例。

怎么使用heap和map

題意:
給一組詞,統計出現頻率最高的 k 個。
比如說 “I love leetcode, I love coding” 中頻率最高的 2 個就是 I 和 love 了。

有同學覺得這題特別簡單,但其實這題只是母題,它可以升級到<span >系統設計</span>層面來問:

在某電商網站上,過去的一小時內賣出的最多的 k 種貨物。

我們先看算法層面:

<span >思路:

統計下所有詞的頻率,然后按頻率排序取最高的前 k 個唄。

<span >細節:

用 HashMap 存放單詞的頻率,用 minHeap/maxHeap 來取前 k 個。

<span >實現:

  1. 建一個 HashMap <key = 單詞,value = 出現頻率>,遍歷整個數組,相應的把這個單詞的出現次數 + 1.

這一步時間復雜度是 O(n).

  1. 用 size = k 的 minHeap 來存放結果,定義好題目中規定的比較順序
    a. 首先按照出現的頻率排序;
    b. 頻率相同時,按字母順序。

  2. 遍歷這個 map,如果
    a. minHeap 里面的單詞數還不到 k 個的時候就加進去;
    b. 或者遇到更高頻的單詞就把它替換掉。

<span >時空復雜度分析:

第一步是 O(n),第三步是 nlog(k),所以加在一起時間復雜度是 O(nlogk).

用了一個額外的 heap 和 map,空間復雜度是 O(n).

代碼:

class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        // Step 1
        Map<String, Integer> map = new HashMap<>();
        for (String word : words) {
            Integer count = map.getOrDefault(word, 0);
            count++;
            map.put(word, count);
        }
        
        // Step 2
        PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<>(k+1, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
                if(e1.getValue() == e2.getValue()) {
                    return e2.getKey().compareTo(e1.getKey());
                }
                return e1.getValue().compareTo(e2.getValue());
            }
        });
        
        // Step 3
        List<String> res = new ArrayList<>();
        for(Map.Entry<String, Integer> entry : map.entrySet()) {
            minHeap.offer(entry);
            if(minHeap.size() > k) {
                minHeap.poll();
            }
        }
        while(!minHeap.isEmpty()) {
            res.add(minHeap.poll().getKey());
        }
        Collections.reverse(res);
        return res;
    }
}

感謝各位的閱讀,以上就是“怎么使用heap和map”的內容了,經過本文的學習后,相信大家對怎么使用heap和map這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵石县| 大姚县| 沧州市| 微山县| 梅河口市| 文化| 涡阳县| 新竹县| 溧阳市| 札达县| 承德县| 宜兴市| 长寿区| 天峻县| 扎兰屯市| 汕头市| 黄龙县| 辛集市| 如东县| 和龙市| 泸州市| 鄱阳县| 兴国县| 石城县| 宿松县| 富阳市| 买车| 左贡县| 菏泽市| 临汾市| 水城县| 龙口市| 镇安县| 分宜县| 海晏县| 永城市| 民和| 嘉义县| 方城县| 临潭县| 西青区|