欢迎光临散文网 会员登陆 & 注册

复盘|第86场双周赛

2022-10-23 20:30 作者:UCLmsc  | 我要投稿

2395. 和相等的子数组 https://leetcode.cn/problems/find-subarrays-with-equal-sum/

【滑动窗口】朴素版大小为2的滑动窗口。

【滑动窗口】用pairwise代替nums[i] + nums[i + 1]。

【滑动窗口】用pairwise代替nums[i] + nums[i + 1],用map(sum, _)代替相加。统计相邻数字的和,加入哈希表去重,去重后如果不足n-1个,则子数组存在。

2396. 严格回文的数字 https://leetcode.cn/problems/strictly-palindromic-number/

【模拟】写一个进制转换函数converter将n转换为x进制,将n转换为2~n-2的所有进制数,判断条件。

【脑筋急转弯】n = 4时,2进制下为100,不是回文串,n > 4时,根据带余除法n = qb + r,取b = n - 2,q = 1, r = 2,所以n在n - 2进制下为12,不是回文串。在n的所有取值范围内都能找到反例,故返回false。

2397. 被列覆盖的最多行数 https://leetcode.cn/problems/maximum-rows-covered-by-columns/

【DFS】直接二进制枚举选中的列,然后判断是否覆盖所有行中的 1,若是,更新答案。(二进制枚举:只有0 1 两种状态,用数组存浪费空间太大,用二进制存)

【二进制枚举】由于数据范围较小,可以枚举所有大小为cols的列编号集合,对于每个集合,遍历mat,统计所有1被覆盖的行的个数,个数最大值即为答案。代码中,用二进制表示集合,二进制的第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的二进制数,Gosper's Hack算法原理:从右往左找到第一个01变成10,10右边的所有11全部挪到最右边。(lowbit为补码 = x & -x)

2398. 预算内的最多机器人数目 https://leetcode.cn/problems/maximum-number-of-robots-within-budget/

【单调队列 + 双指针】求滑动窗口内的最大值,可以用单调队列来求解,一般可以二分枚举窗口k的大小,找到一个最大的k,实际本题不需要二分枚举,只需要把固定窗口改为双指针即可。代码中,维护一个单调递减的队列,堆顶的元素充电时间最长,tot记录window里的runningCosts之和,枚举区间右端点right,计算区间左端点left最小值,如果左端点left不满足要求就右移。



复盘|第86场双周赛的评论 (共 条)

分享到微博请遵守国家法律