今天本來應該寫兩道題把這一章節結束掉,奈何第二題前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出去當前隊首的元素,使得隊列中當前最大的數不會一直存在
今天把數組篇章的題全部重做了一遍,出乎意料的是沒有一道題是一次性寫對的,總是錯一些細節性的地方,關于雙指針的理解更是忘得一塌糊涂,不敢想后面的篇章還記得多少。。。果然做過的題要時常溫習,我感覺這次重做后對知識點的理解又深入了一層(即便第一次做的時候我已經感到自己理解的很透徹了),最后,代碼一定要多寫,最好一次性寫完中間不看答案,只有自己寫出來才能知道哪些地方理解不到位,哪些細節沒有考慮到。最后,明天重做鏈表章節題目!以后在正常學習計劃之外每天復習一章節,過完一輪再過一輪,直到題目可以一次性寫對為止