leetcode347 - Top K Frequent Elements - medium
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
Note:
* You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
* Your algorithm's time complexity must be better than O(n log n), where n is the array's size.
?
共用部分是用map統(tǒng)計頻次。接下來選出topk頻次有variation。
1.O(nlogk), O(k). 堆。
寫專屬comparator,根據(jù)Entry<K, V>里的V也就是本題的頻率排序,讓堆頂始終維持是最小頻率的元素,你最菜,當(dāng)堆大小過k的時候把你擠走哦!
?
實現(xiàn)1:
class Solution {private class EntryComparator implements Comparator<Map.Entry<Integer, Integer>> {@Override// P2: 要過OJ要聲明一下Map.Entry, 沒辦法只寫Entry,因為不夠普遍吧,沒適配。public int compare(Map.Entry<Integer, Integer> a, Map.Entry<Integer, Integer> b) {return a.getValue() - b.getValue();}}public List<Integer> topKFrequent(int[] nums, int k) {Map<Integer, Integer> freqs = new HashMap<>();for (int num : nums) {freqs.put(num, freqs.getOrDefault(num, 0) + 1);}// 1.PQPriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(new EntryComparator());for (Map.Entry<Integer, Integer> e : freqs.entrySet()) {minHeap.offer(e);if (minHeap.size() > k) {minHeap.poll();}}List<Integer> ans = new ArrayList<>();for (int i = 0; i < k; i++) {// P1:注意加到答案的是key不是entry ans.add(minHeap.poll().getKey());}Collections.reverse(ans);return ans;} }?
?
實現(xiàn)2:
class Solution {public List<Integer> topKFrequent(int[] nums, int k) {Map<Integer, Integer> freqs = new HashMap<>();for (int num : nums) {freqs.put(num, freqs.getOrDefault(num, 0) + 1);}// 1.bucket sort// P1: 注意這個初始化!List<Integer>[] buckets = new List[nums.length + 1];for (int num : freqs.keySet()) {int frequency = freqs.get(num);if (buckets[frequency] == null) {buckets[frequency] = new ArrayList<>();}buckets[frequency].add(num);}List<Integer> ans = new ArrayList<>();for (int i = buckets.length - 1; i >= 0; i--) {if (buckets[i] == null) {continue;}for (int j = 0; j < buckets[i].size() && k > 0; j++) {ans.add(buckets[i].get(j));k--;}}return ans;} }?
轉(zhuǎn)載于:https://www.cnblogs.com/jasminemzy/p/9739815.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的leetcode347 - Top K Frequent Elements - medium的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: luogu P3293 [SCOI201
- 下一篇: 注册视图