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

复盘|第101场双周赛

2023-04-02 20:40 作者:UCLmsc  | 我要投稿

从两个数字数组里生成最小数字

【模拟 + 哈希表】观察如果nums1和nums2有交集,那么答案是1位数,即交集的最小值。否则nums1和nums2中各取一个最小值x和y,答案是min(10x+y,10y+x)。

【模拟 + 位运算】二进制位上的1表示集合存在该元素(向集合中添加元素就是|上1<<x),&运算可以求交集,达到O(1)的空间复杂度。(c++的__builtin_ctz能返回二进制下末尾0的个数,java是Integer.numberOfTrailingZeros,go是bits.TrailingZeros)

找到最大开销的子字符串

【DP】根据题意,生成一个字母和价值的映射,题目转换为求价值数组的最大子数组和(允许子数组为空)。定义f[i]为以a[i]结尾的最大子数组和,f[i] = max(f[i -1], 0) + a[i],答案为max(f)。

使子数组元素和相等

【中位数贪心 + 裴蜀定理】如果arr不是循环数组,则有arr[i] + arr[i+1] + ... arr[i + k - 1] = arr[i + 1] + arr[i + 2] + ... + arr[i + k],约掉得arr[i] = arr[i + k],则可以按i mod k的结果将arr分组,对每一组,计算所有元素相等的最少运算次数。根据中位数贪心,将b的所有元素变成b的中位数(m/2)是最优的。观察到arr[0]和arr[1]不管如何循环都不在同一组,得到一个循环数组如果既有周期n和周期k,那么也有周期gcd(n,k),根据裴蜀定理,arr[i] = arr[i + nx + ky] = arr[i + gcd(n, k)]。

图中的最短环

【BFS】枚举,对每个start跑bfs,维护0到每个start到i的最短路dis,同时入队node和father。


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

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