leetcode——哈希表

49. 字母異位詞分組

題目

給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]
說明:

所有輸入均爲小寫字母。
不考慮答案輸出的順序。

--------------------------------------------------------------------------------------------------

思路1

用哈希表來存儲String, List<String>鍵值對:對於遍歷到的每個字符串chArr,可以將它排好序後放入map中,之後只要判斷map中是否有對應的String,若存在則取出對應的List,再將字符串放入;若不存在則新建一個list,將字符串放入新list後,再將(排好序的chArr,list)放入map中。

思路2

同樣也是用哈希表,只不過表的key項是Integer:同時我們新建一個26個質數數組primes。對於遍歷到的每個字符串chArr,將其字符對應的質數數組primes裏的值相乘,如果字符串不相同,最後的乘積肯定也不相同。以此乘積作爲key,這樣就保證了唯一性。

思路2可能會出現溢出,即出現多個字符z。

 


347. 前 K 個高頻元素

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

示例 1:

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

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

--------------------------------------------------------------------------------------------------

思路

通過哈希表來記錄元素與出現的次數,然後使用最大堆來存儲元素,重寫其比較規則爲判斷兩數出現的次數。

    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
           map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }
       PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //若o2出現次數大於o1出現次數,返回1,小於則返回-1。
                return map.get(o1) - map.get(o2);
            }
       });
        
        for(int num : map.keySet()) {
            maxHeap.add(num);
            if(maxHeap.size() > k) {
              maxHeap.poll();
            }
        }
        int[] res = new int[k];
        for(int i = 0; i < k; i++) {
          res[i] = maxHeap.poll();
        }
        return res;
    }

複雜度分析

時間複雜度:O(N log(k))O(N log(k))。Counter 方法的複雜度是 O(N),建堆和輸出的複雜度是 O(N log(k))。因此總複雜度爲 O(N + N log(k)) = O(N log(k))。
空間複雜度:O(N),存儲哈希表的開銷。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章