今天正常时间醒了,过年整个人都没有什么干劲,做什么都无法专心,只想休息,然而平时又很难得有这么大段的属于自己的时间,不好好利用实在是可惜。
起来先运动了一下,把昨天网课留下的作业刷了一道,理解优先队列中comparator的使用花了一些时间。然后就是节假日日常的在湖边散步,没想到除夕还是有那么多人,跟我想象的万人空巷差远了,回去的时候餐馆和快餐店都关门了,外卖倒是还有,一些大的饭店已经坐满了吃团圆饭的人。懒得等外卖,就久违地自己煮了螺蛳粉,吃了三分之二,就吃撑了,冬天吃挺暖和的,自己过春节虽然冷清,但是也比在国外的时候春节不放假,圣诞节又很难融入要好一些,至少拥有了一个难得的长假,同事工作电话也比平时客气,还会祝你节日快乐。
今日进度: 1.坚持刷题,每天搞懂一个小的知识点也是进步 2.坚持运动,出去散步了心情也会好一些 3.坚持录小王子 4.坚持记录
学习笔记: 1.java内置的priority queue是使用小顶堆升序排列的,即弹出的元素从小到大,如果想要倒序,需要使用comparator自定义priority queue。 2.347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
解题思路:使用查找表来存储每个元素出现的频率,创建大小为K的优先队列,遍历查找表,将数值和频次存入优先队列,维护队列,如果当前数值的频次比队列顶部的频次大,就取出顶部元素,插入当前元素,保持队列中为频次最高的数值,最后遍历优先队列中的数值即可。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> list = new HashMap<Integer, Integer>();
for(int num : nums){
list.put(num, list.getOrDefault(num, 0)+1);
}
PriorityQueue<int[]> p = new PriorityQueue<int[]>(
new Comparator<int[]>(){
public int compare (int[] m, int[] n){
return m[1] - n[1];
}
}
);
for(Map.Entry<Integer, Integer> entry : list.entrySet()){
int num = entry.getKey();
int count = entry.getValue();
if(p.size()==k){
if(p.peek()[1] < count){
p.poll();
p.offer(new int[]{num, count});
}
}
else{
p.offer(new int[]{num, count});
}
}
int[] res = new int[k];
for(int i=0; i<k; i++){
res[i] = p.poll()[0];
}
return res;
}
}
优先队列会取出最小或最大的数值,使用起来十分方便,省去了手动排序的时间,是很好用的数据结构。明天准备正式把项目课程买下来尝试着自己做,新春快乐!明天继续更新。
|