复盘|第101场双周赛
从两个数字数组里生成最小数字
【模拟 + 哈希表】观察如果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。

