一句话总结:真不简单。
原题链接:239 滑动窗口最大值
拿到手觉得很简单,实际上操作一些就会困难重重。最后看了题解用的优先队列解决的,确实不简单。先打个标记,一周以后再来一遍。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ans = new int[n - k + 1];
PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>(){
public int compare(int[] pair1, int[] pair2) {
return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
}
});
for (int i = 0; i < k; i++) {
pq.offer(new int[]{nums[i], i});
}
ans[0] = pq.peek()[0];
for (int i = k; i < n; ++i) {
pq.offer(new int[]{nums[i], i});
while (pq.peek()[1] <= i - k) {
pq.poll();
}
ans[i - k + 1] = pq.peek()[0];
}
return ans;
}
}
原题链接:347 前K个高频元素
还是利用优先队列。先利用哈希表将元素及其频次都收集起来,然后限制优先队列的元素个数,小于k那么将其入队,等于k的时候先将队列中元素频次最小的出队,再入队一个。最后队列中剩下的就是需要的前K个高频元素了。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
for (int x : nums) map.put(x, map.getOrDefault(x, 0) + 1);
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return map.get(a) - map.get(b);
}
});
for (int key : map.keySet()) {
if (pq.size() < k) pq.add(key);
else if (map.get(key) > map.get(pq.peek())) {
pq.poll();
pq.add(key);
}
}
List<Integer> ans = new ArrayList<>();
while (!pq.isEmpty()) ans.add(pq.poll());
int[] res = new int[ans.size()];
for (int i = 0; i < ans.size(); ++i) {
res[i] = ans.get(i);
}
return res;
}
}