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),存儲哈希表的開銷。