Merge pull request #90 from Joshua-Lu/patch-6

添加 0347.前K个高频元素 Java版本
This commit is contained in:
Carl Sun
2021-05-14 09:54:48 +08:00
committed by GitHub

View File

@ -134,59 +134,33 @@ public:
Java Java
```java ```java
public class N0347 {
/** class Solution {
* 解法:
* 1.统计频次。O(n)
* 2.排序。O(nlogn)
* 3.取前K个元素
*
* 注意到排序的时候需要用小顶堆而不是大顶堆。因为每次需要把最小的堆顶弹出去最后才剩下最大的k个。
* 时间复杂度O(n + nlogk) = O(nlogk)
*/
public int[] topKFrequent(int[] nums, int k) { public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> map = statistic(nums); int[] result = new int[k];
HashMap<Integer, Integer> map = new HashMap<>();
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() { for (int num : nums) {
@Override map.put(num, map.getOrDefault(num, 0) + 1);
public int compare(Integer o1, Integer o2) {
return map.get(o1) - map.get(o2);
}
});
for (Integer key : map.keySet()) {
if (pq.size() < k) {
pq.offer(key);
} else if (map.get(pq.peek()) < map.get(key)){
pq.poll();
pq.offer(key);
}
} }
int[] result = new int[k]; Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
for (int i = 0; i < k; i++) { // 根据map的value值正序排相当于一个小顶堆
result[i] = pq.poll(); PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o1.getValue() - o2.getValue());
for (Map.Entry<Integer, Integer> entry : entries) {
queue.offer(entry);
if (queue.size() > k) {
queue.poll();
}
}
for (int i = k - 1; i >= 0; i--) {
result[i] = queue.poll().getKey();
} }
return result; return result;
} }
// key: 值value次数
private HashMap<Integer, Integer> statistic(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (map.get(num) == null) {
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
return map;
}
} }
``` ```
Python Python