fifty project算是失敗了一半了
成功的那一半在于一定程度上拯救了我的作息和健康,兩個月前入職體檢的肝有點不健康,昨天復查發現全都回到了健康范圍!尿酸也在正常范圍!就是體重還是沒減下來hhh
失敗的一半在于自己很差勁的規劃能力依舊差勁,每天還是喜歡根據喜好進行學習,往往就變成了刷題日記了
不管怎么說,經歷過就很棒!加油加油加油!
今日完成記錄
Time | Plan | 完成情況 |
---|---|---|
17:30 - 19:30 | 🏸 | √ |
20:00 - 21:30 | Leetcode | √ |
Leetcode
上周完成的周賽少有地拿下了三個題,上了一波大分【和Knight的距離有更近了!】,第四題本來也有機會拿下的QAQ,是既熟悉又陌生的樹上倍增算法,這個方法怎么也是寫了又寫,學了又學,思路也大致都對,就差一丟丟!昨天把那個壓軸給復盤了一下,今天重新打開靈神的常用數據結構題單,繼續堆部分的題目咯。
今天的刷題感覺收獲頗豐! 懶刪除堆和字典樹計數
滑動窗口中位數:給一個數組,要求計算大小為K的滑動窗口中的中位數
思路:因為是在對頂堆的題目里面,所以上來就有思路了,拿一個最大堆存較小的一半數,拿一個最小堆存較大的一半數,然后每次從堆頂計算中位數。麻煩的地方在于滑動窗口出窗口的數要如何進行刪除。我的思路是用兩個hashSet記錄兩個堆存儲過的數字的下標,然后利用hashset懶刪除【這也算一種比較呆的懶刪除吧hhhh】后來學習了靈神的懶刪除【用一個hashmap記錄堆中數字需要刪除的次數,當push數字的時候檢查一下是否有刪除次數,有的話直接修改刪除次數相當于刪除了;另外,在每次pop或者peek都得進行一次堆頂的實際刪除,也就是檢查堆頂元素是否刪除次數為0】
靈神的代碼將這個堆封裝了一層,優雅不少~
含最多k個可被p整除的子數組:給定一個數組以及K和P,要求統計有多少個子數組【數組中任意長度的連續數】,其中包含最多k個可以整除P的數。要求做到O(n^2)
思路:一開始想了個O(n)的解法,但是沒注意到不同子數組這一點,就是可能出現兩個子數組選取的數下標是不同的但是數都是一樣的,例如數組2,3,3中長度為1的子數組有【2】、【3】、【3】但其中后兩個視作同一個子數組。
簡述一下這個O(n)做法:首先將這個數組根據能否整除p變成0和1【能整除則為1不能則為0】,然后計算前綴和數組,并且記錄每個前綴和首次出現的位置(實際上就是能整除p的數的位置),pre[i]表示從i到數組最初,共有pre[i]個數能整除p。那么對于每個位置,以當前位置為結尾的符合條件的子數組數量有pre[i] <= k ? i + 1 : i - first[pre[i] - k]。累加即可得解。
正解是:我回頭看了一眼這個題目是哪個題單,發現居然是字典樹題單,瞬間幡然醒悟,居然是用字典樹進行計數!!從每個數開始向后遍歷構造子數組,只要當前子數組依然符合要求就繼續構造。同時用字典樹存儲當前方案。最后統計這顆字典樹有多少個節點即可!【實際上在構造過程中就可以統計出來】
靈神大佬說過的如何評價做題是否有效,當想不出思路看了題解之后,如果是腦瓜子嗡的一下,“還能這樣!”那就是有用的,如果是“我真是個XX”那說明還得練hhhh
應該是自己刷題少了,字典樹計數確實好像沒遇到過emmmm
收獲頗豐~