復盤|第86場雙周賽
2395. 和相等的子數(shù)組?https://leetcode.cn/problems/find-subarrays-with-equal-sum/
【滑動窗口】樸素版大小為2的滑動窗口。
【滑動窗口】用pairwise代替nums[i] + nums[i + 1]。
【滑動窗口】用pairwise代替nums[i] + nums[i + 1],用map(sum, _)代替相加。統(tǒng)計相鄰數(shù)字的和,加入哈希表去重,去重后如果不足n-1個,則子數(shù)組存在。
2396. 嚴格回文的數(shù)字?https://leetcode.cn/problems/strictly-palindromic-number/
【模擬】寫一個進制轉換函數(shù)converter將n轉換為x進制,將n轉換為2~n-2的所有進制數(shù),判斷條件。
【腦筋急轉彎】n = 4時,2進制下為100,不是回文串,n > 4時,根據(jù)帶余除法n = qb + r,取b = n - 2,q = 1, r = 2,所以n在n - 2進制下為12,不是回文串。在n的所有取值范圍內都能找到反例,故返回false。
2397. 被列覆蓋的最多行數(shù)?https://leetcode.cn/problems/maximum-rows-covered-by-columns/
【DFS】直接二進制枚舉選中的列,然后判斷是否覆蓋所有行中的 1
,若是,更新答案。(二進制枚舉:只有0 1 兩種狀態(tài),用數(shù)組存浪費空間太大,用二進制存)
【二進制枚舉】由于數(shù)據(jù)范圍較小,可以枚舉所有大小為cols的列編號集合,對于每個集合,遍歷mat,統(tǒng)計所有1被覆蓋的行的個數(shù),個數(shù)最大值即為答案。代碼中,用二進制表示集合,二進制的第i位為1表示i在集合中,為0表示i不在集合中。01矩陣用[sum(i<< j) for i, j in enumerate(row)]能逆序,相當于2^0+ 2^1+ 2^2+…用mask檢驗枚舉的情況與實際情況是否匹配,用&,如果row(枚舉的) & row(mask的) == row(任意一個)說明匹配。
【Gosper's Hack】Gosper's Hack能快速枚舉cols個1的所有集合,比如n =7, cols = 4,需要枚舉0001111 ~ 1111000的所有四個1的二進制數(shù),Gosper's Hack算法原理:從右往左找到第一個01變成10,10右邊的所有11全部挪到最右邊。(lowbit為補碼 = x & -x)
2398. 預算內的最多機器人數(shù)目?https://leetcode.cn/problems/maximum-number-of-robots-within-budget/
【單調隊列 + 雙指針】求滑動窗口內的最大值,可以用單調隊列來求解,一般可以二分枚舉窗口k的大小,找到一個最大的k,實際本題不需要二分枚舉,只需要把固定窗口改為雙指針即可。代碼中,維護一個單調遞減的隊列,堆頂?shù)脑爻潆姇r間最長,tot記錄window里的runningCosts之和,枚舉區(qū)間右端點right,計算區(qū)間左端點left最小值,如果左端點left不滿足要求就右移。