为了转行程序员而努力的第三十八天-优先队列

今天应该算是起晚了,好在比昨天有干劲。刷了两道优先队列的题之后,做了运动。录了小王子,还花时间配了英文版的音,自己在家做了烤肉,吃完又看了会儿书。下午出去看了一场电影,内容挺不错的,就是太费时间,出来天都黑了,买了晚餐回去吃完之后,玩了一会儿手机,整个人又不好了,有一种莫名其妙地情绪低落,一时很难抑制,再刷题也集中不了精力,索性放弃,开始写日记。看来还是应该早睡早起,早晨的效率比晚上高,而且白天也不容易陷入低落的情绪里,户外锻炼也还是要坚持,下午锻炼可以避免晚上情绪低落,今天也应该写完总结之后早点睡觉。

今日进度:
1.意识到目前的情绪状态还是容易在晚上突然出现反复,应该继续坚持之前一些能有效缓解情绪的方法,如不要玩手机浏览只为吸引流量贩卖焦虑的文章,不要把精力集中在负面的东西上,多想一些好的方面,让人产生积极情绪的事情,白天条件允许的情况下尽量户外运动,晚上早点睡,早上早点起,缩短夜晚的时间,因为深夜比白天容易陷入情绪低落,与情绪的战斗是持久的,要坚持下去,不要因为最近都比较顺利就掉以轻心。

2.坚持刷题,昨天还觉得很难的优先队列,再今天运用它的思维来解决问题之后,很快速而且方便的就刷了两道题,确实是很有用的数据结构,虽然hard的题目还是觉得有点困难,但第一遍刷可以先放一放。

3.录了小王子英文版的部分配音,听录音发现有一些细节上的发音其实还是不太标准,但是比之前确实也是有进步的

4.坚持记录,有时候把自己的想法写出来也是一种舒缓负面情绪的方法,可以很好的起到转移思考注意力的效果

5.明天必须逼着自己正式开始项目课程的学习,不然假期很快就过去了,工作日更难开始新的项目,决定还是先把后端部分课程买下来,视学习情况再买前端课程,虽然这样可能在金钱上会多花一些

学习笔记:
1.面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

解题思路:使用优先队列,将所有元素装入优先队列,弹出K个数,即为数组中最小的K个数

class Solution {
    public int[] smallestK(int[] arr, int k) {
        PriorityQueue<Integer> p = new PriorityQueue<Integer>();
        for(Integer a : arr){
            p.offer(a);
        }
        int[] res = new int[k];
        for(int i=0; i<k; i++){
            res[i] = p.poll();
        }
        return res;
    }
}

2.215. 数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

解题思路:将所有的元素都放入大顶堆优先队列中,弹出K-1个元素后,下一个元素即为第K个最大的元素。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> p = new PriorityQueue<Integer>(
            new Comparator<Integer>(){
                public int compare(Integer a, Integer b){
                    return b-a;
                }
            }
        );
        for(Integer num : nums){
            p.offer(num);
        }
        for(int i=0; i<k-1; i++){
            p.poll();
        }
        return p.poll();
    }
}

感觉优先队列真是把中等难度题变为简单难度的题的神器啊,不管怎么样,明天必须开始项目类课程了,虽然好像又出现了类似于开始刷题之前的那种畏难情绪,毕竟也有近一年半没有从0开始搭建项目了,但是要努力克服恐惧,且这次从头到尾每一行代码都要弄懂,不能在糊弄了事了,也要补充学习一些java的框架,基本上Java的文档学习基本语法也学的差不多了,还剩下线程的几个概念:线程间通信,线程死锁,线程控制:挂起、停止和恢复。明天也全都补充一下吧,也可以开始进入网课的下一个阶段二叉树的学习了,新年的第一天,希望有一个好的结尾。明天继续加油啊!

你可能感兴趣的:(转行刷题项目记录,java,算法)