leetcode 347 取出现频率前K的
public static int[] topKFrequent(int[] nums, int k){
int[] res = new 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);
}
Comparator cmp = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Map.Entry<Integer,Integer> a = (Map.Entry<Integer,Integer>)o1;
Map.Entry<Integer,Integer> b = (Map.Entry<Integer,Integer>)o2;
return b.getValue()-a.getValue();
}
};
//建立大顶堆
PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>(cmp);
for (Map.Entry<Integer,Integer> kv:map.entrySet()) {
queue.offer(kv);
}
// 弹出前K
for(int i=0;i<k;i++){
res[i]=queue.poll().getKey();
}
return res;
}
leetcode 239 滑动窗口求最值
int[] res=new int[nums.length-k+1];
Deque<Integer> que= new LinkedList<>();
// 单独前K个先入队列,因为不用pop
for(int i=0;i<k;i++){
while(!que.isEmpty() && nums[i]>que.getLast()){
que.removeLast();
}
que.add(nums[i]);
}
res[0]=que.peek();
//sliding window starts to move
for(int i=k;i<nums.length;i++){
//出窗口元素为队列头,要弹出队列
if(nums[i-k]==que.peek()){
que.pop();// 其实队列要用 poll更标准
}
//入窗口元素要入队列 2* ,但是比起小的移走 1*,因为对求最值无益
// 1*
while(!que.isEmpty() && nums[i]>que.getLast()){
que.removeLast();
}
// 2*
que.add(nums[i]);
// 最后的数组
res[i-k+1]=que.peek();
}
return res;
}