给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2:
输入: nums = [1], k = 1 输出: [1]
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
PriorityQueue<int[]> queue = new PriorityQueue<>((int[] m, int[] n) -> {
return m[1] - n[1];
});
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
if (queue.size() == k) {
if (queue.peek()[1] < value) {
queue.poll();
queue.offer(new int[]{key, value});
}
} else {
queue.offer(new int[]{key, value});
}
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = queue.poll()[0];
}
return result;
}
}
小顶堆,用优先队列(PriorityQueue 来实现)
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
class Solution {
public int nthUglyNumber(int n) {
int[] factors = {2, 3, 5};
PriorityQueue<Long> heap = new PriorityQueue<>();
Set<Long> appeared = new HashSet<>();
appeared.add(1L);
heap.offer(1L);
int res = 0;
for (int i = 0; i < n; i++) {
long cur = heap.poll();
res = (int) cur;
for (int factor: factors) {
long next = cur * factor;
if (appeared.add(next)) {
heap.offer(next);
}
}
}
return res;
}
}