復盤|第339場周賽
最長平衡子字符串
【暴力】數(shù)據(jù)范圍較小,直接暴力窮舉。
【雙指針模擬】找到所有01串,其中平衡字符串的長度是min(pre, cur) * 2,用pre記錄上一段連續(xù)字符的個數(shù),用cur記錄當前段連續(xù)字符的個數(shù),在所有01串的末尾(分界線:字符串末尾或下一個字符不等于當前字符)更新pre和cur,如果是1就更新最大值。
轉(zhuǎn)換二維數(shù)組
【哈希表模擬】觀察到行數(shù)至多為nums中某個元素出現(xiàn)的最大次數(shù),每行平鋪一個數(shù)。
優(yōu)化寫法,用哈希表維護剩余次數(shù),如果剩余次數(shù)為0,將x從cnt中刪除。
老鼠和奶酪
【貪心】讓老鼠1優(yōu)先吃reward1[i] - reward2[i]最大的k個奶酪,剩下的給老鼠2吃。代碼中需要對差值數(shù)組diff[i]排序。
最少翻轉(zhuǎn)操作數(shù)
【平衡樹 + BFS】 對于子數(shù)組[L,R]中的任意下標i,翻轉(zhuǎn)后的下標是L+R-i(中心對稱翻轉(zhuǎn),兩個下標相加恒等于L+R)。那么當子數(shù)組向右滑動時,工和R都增加1,所以翻轉(zhuǎn)后的下標會增加2;當子數(shù)組向左滑動時,L和R都減少1,所以翻轉(zhuǎn)后的下標會減少2因此,i翻轉(zhuǎn)后的所有位置組成了一個公差為2的等差數(shù)列(不考慮banned)。如果不考慮數(shù)組的邊界,那么范圍是[i-k+1, i+k-1]。如果i在數(shù)組左邊界0附近,那么翻轉(zhuǎn)時會受到數(shù)組左邊界的約束,當子數(shù)組在最左邊時,L=0,R=k-1,i翻轉(zhuǎn)后是0+(k-1)-i=k-i-1,所以小于-i-1的點是無法翻轉(zhuǎn)到的;如果i在數(shù)組右邊界n-1附近,那么翻轉(zhuǎn)時會受到數(shù)組右邊界的約束,當子數(shù)組在最右邊時,L=n-k,R=n-1,i翻轉(zhuǎn)后是(n-k)+(n-1)-i=2n-k-i-1,所以大于2n-k-i-1的點是無法翻轉(zhuǎn)到的。所以實際范圍為max(i-k +1,k-i-1),min(i+k-1,2n-k-i-1)。用兩棵平衡樹分別維護不等于p也不在banned中的偶數(shù)下標和奇數(shù)下標。然后用BFS模擬。在對應的平衡樹上,一邊遍歷翻轉(zhuǎn)后的所有位置,一邊把平衡樹上的下標刪除,加到隊列中。這樣可以避免重復訪問已經(jīng)訪問過的節(jié)點。