今天本来应该写两道题把这一章节结束掉,奈何第二题前k个高频元素需要用的二叉树相关代码实在不会写(倒是能看懂)等我学完二叉树再把这道题亲自写一遍吧
今天工作量比较小,准备从第一天的任务开始把题目重新再做一遍
239. 滑动窗口最大值 - 力扣(LeetCode)
class Solution {private:class MyQueue{public:deque<int> que;void pop(int value){if(!que.empty()&&que.front()==value){que.pop_front();}}void push(int value){while(!que.empty()&&value>que.back()){que.pop_back();}que.push_back(value);}int front(){return que.front();}};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int>result;for(int i=0;i<k;i++){que.push(nums[i]);}result.push_back(que.front());for(int i=k;i<nums.size();i++){que.pop(nums[i-k]);que.push(nums[i]);result.push_back(que.front());}return result;}
};
主要思路:
1.如果push进来的元素比队尾的元素大,则弹出队尾元素,直到队列最后一个数大于该元素,从而保持单调队列里的单调递减。
2.当窗口要移除的元素等于队头的元素时,pop出去当前队首的元素,使得队列中当前最大的数不会一直存在
今天把数组篇章的题全部重做了一遍,出乎意料的是没有一道题是一次性写对的,总是错一些细节性的地方,关于双指针的理解更是忘得一塌糊涂,不敢想后面的篇章还记得多少。。。果然做过的题要时常温习,我感觉这次重做后对知识点的理解又深入了一层(即便第一次做的时候我已经感到自己理解的很透彻了),最后,代码一定要多写,最好一次性写完中间不看答案,只有自己写出来才能知道哪些地方理解不到位,哪些细节没有考虑到。最后,明天重做链表章节题目!以后在正常学习计划之外每天复习一章节,过完一轮再过一轮,直到题目可以一次性写对为止