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

复盘|第82场双周赛

2022-12-25 20:30 作者:UCLmsc  | 我要投稿

计算布尔二叉树的值

【递归】简洁写法——自身递归。

坐上公交的最晚时间

【双指针模拟】排序后,用双指针模拟乘客上车的过程:遍历公交车,找哪些乘客可以上车(先来先上车)。模拟结束后:如果最后一班公交还有空位,可以在发车时到达公交站,如果此刻有人,可以顺着他往前找到没人到达的时刻;如果最后一班公交没有空位,可以找到上一个上车的乘客,顺着他往前找到一个没人到达的时刻。

最小差值平方和

【贪心】等价转换——在nums1[i]上+1,等价于在nums2[i]上-1,反之亦然。原问题可转换为对数组a[i] = nums1[i] - nums2[i] 执行 k = k1 + k2 次操作,能得到的Σa[i]^2的最小值。对于两个数先把大的数-1会更优,先将a倒序排序,然后从左到右遍历,同时更新剩余操作次数k。当遍历到a[i]时,a[0]到a[i - 1]均已减小至a[i],判断k次操作能否让a[0]到a[i]全部减小至a[i + 1] 。比较k与所需次数c=(i+1)(a[i-a[i+1])的大小。如果c<k,那么从a0]到a[i]均可以减小至a[i+1],更新k=k-c。如果c≥k,那么从a[0]到a[i]中:有k mod(i+1)个元素可以额外减小 +1;有i+1-kmod(i+1)个元素可以额外减小后续无法继续减小,应退出循环。代码实现时,可以在a末尾加一个哨兵0,减少边界判断。

元素值大于变化阈值的子数组

【并查集】数组中的元素越大越好,不妨从大往小考虑nums[i]。子数组的长度k越大,threshold/k就越小,越能满足要求。把考虑过的元素都串起来,这条链的长度就是k。需要动态维护每条链的长度,高效地串联两条链。用并查集,遍历到nums[i]时,用并查集合并i和i+1,这样可以把连续访问过的位置串起来,同时维护链的长度。

【单调栈】枚举每个元素,假设它是子数组中的最小值,用单调栈计算左右边界。


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

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