復(fù)盤|第309場周賽
2399. 檢查相同字母間的距離?https://leetcode.cn/problems/check-distances-between-same-letters/
【哈希表】統(tǒng)計每個字母的位置,遍歷哈希表,判斷每個字母的下標之差是否等于distance[i]。
2400. 恰好移動 k 步到達某一位置的方法數(shù)目?https://leetcode.cn/problems/number-of-ways-to-reach-a-position-after-exactly-k-steps/
【記憶化搜索】想到dp[i] [j]表示在i位置,走j步或剩j步,當前狀態(tài)下的方案數(shù)。dp數(shù)組為了避免負數(shù),可以寫成記憶化搜索,dfs(x, left),x表示位置,left表示還剩余可走的步數(shù),首先把edge case處理,當前方案數(shù) = 往左走方案數(shù) + 往右走的方案數(shù),可以加幾個剪枝,①距離 > k走不到 ②d與k奇偶性需一致。left == 0時表示已經(jīng)走到終點,是一種方案。
【組合數(shù)學(xué)】推導(dǎo):總共向右走r步,向左走l步,則r + l = k,r - l = m,r = (k + m) / 2, 向右方案數(shù)Comb(k, r),即在k步中選擇r步的方案數(shù)。
2401. 最長優(yōu)雅子數(shù)組?https://leetcode.cn/problems/longest-nice-subarray/
【滑動窗口】根據(jù)題意,要求子數(shù)組內(nèi)每對元素與運算的結(jié)果均為0,即找到一個最長的區(qū)間,區(qū)間里每一個數(shù)的對應(yīng)二進制位只能有一個1,因為如果有2個1,那么這兩個位置對起來(1&1),結(jié)果就是1了,這題數(shù)據(jù)范圍10^9,一共要用三十二個二進制位存,每個位上至多只能有一個1。技巧:當x&y已經(jīng)是0了,可以tmp = x|y,后一個碰到的z直接 z&tmp 就行(因為或運算保留了xy里所有1)。代碼中,用雙指針維護滑動窗口,or_存滑動窗口內(nèi)的或的結(jié)果,xor左指針元素,相當于彈出左指針元素。如果or _ & x不為0,則需要把左指針往右移(彈出左指針指向元素彈出)。同樣,手寫max會加速python。
2402. 會議室 III https://leetcode.cn/problems/meeting-rooms-iii/
【雙堆模擬】 用兩個小頂堆模擬:一個堆維護start_i時刻空閑的會議室的編號,另一個堆維護start_i時刻正在使用的會議室的結(jié)束時間和編號。