复盘|第103场双周赛
K 个元素的最大和
【贪心】反复用最大值,等差数列求和。
找到两个数组的前缀公共数组
【哈希集合】用两个set求交集。
【位运算优化】用位运算表示集合,两个数的AND表示集合的交集,交集的大小就是二进制中1的个数。
网格图中鱼的最大数目
【DFS】DFS求出每个非0连通块元素和的最大值,最大值即为答案。
【BFS】BFS求出每个非0连通块元素和的最大值,最大值即为答案。
将数组清空
【二分 + 离散化】通过构建映射和有序列表,计算间隔和操作数,实现对列表元素的快速删除、移动和获取。遍历 nums
的前 n-1
个元素,记录每个元素与下一个元素之间的间隔 interval
和需要移动这两个元素到末尾的操作数。在记录操作数时,根据 i
和 j
的大小关系来选择字符串 'i < j'
或 'i >= j'
。如果 i > j
,表示需要先移除后面最小的元素,因此操作数加上 n - x
(x
表示当前元素在 nums
中的位置)
【树状数组】因为只有当前最小值才会被标记,因此指针肯定是先标记数组最小值,再标记次小值,因此我们先把所有下标i按nums[i]从小到大排序,就得到了指针的标记顺序。接下来只要研究指针标记i之后到标记j的时候需要进行几次操作即可。由于每一次操作会将指针指向下一个未被标记的数,因此操作的数量即为“下标1和j之间,未被标记的数的个数”。使用树状数组就能在每次O(Iogn)的复杂度内完成查询和维护,因此总体复杂度为O(n log n)。
【思维】在统计移动次数时,遇到要删除的元素,相当于可以免费向后移动一步(因为删除操作已经计入答案)。试想一下,如果数组是单调递增的,就没有任何额外的移动次数。如果第k次要删除的元素在第k一1次要删除的元素的左侧,那么必须多走一整圈,移动次数为-k。累加,即为总的移动次数。