leetcode 第 318 场算法比赛

作者: | 更新日期:

拉了一个算法群

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

年初 3 月 18 号,因为疫情,我在重庆酒店隔离的时候,做了一个决定:打卡 Leetcode 每日一题,看是否可以坚持半年。

如果可以坚持半年,我就拉一个算法群,群里每天分享 Leetcode 每日一题的题解。
当然,群里也可以答疑有比赛相关的算法题,如果有人问的话。

半年很快过去了,事实证明,我做到了(中间有一次工作当天全天忙到24点之后,没来得及做)。

对算法感兴趣的朋友可以扫描下面的群二维码,或者关注公众号,在对话框里回复 “算法群” 获得进群方法。

一、对数组执行操作

题意:给一个数组,顺序扫描处理。
每次可以和向后相邻的元素对比,如果相等,则当前元素值翻倍,后面的元素值设置为0。
最后,将所有为 0 的元素移动到最后,返回数组。

思路:遇到相等的元素,后面的元素置为0,则肯定需要移动到最后。
所以可以扫描数据,记录不为 0 的元素,最后在最后补充 0 即可。

二、长度为 K 子数组中的最大和

题意:给一个数组,求长度为 k 且值互不相同的最大子数组和。

思路:双指针。

右指针依次加入到 map 。
加入后,如果存在重复值或者队列大于 K,则移除左指针,直到没有重复值。

之后,如果队列大小为 K,则找到一个答案。

三、雇佣 K 位工人的总代价

题意:给一个数组,代表工人的工资,然后使用下面的规则选择 k 个工人。

规则:数组两端分别选择 C 个人,这些人力工资最少且最靠左的那个人会被选中。

思路:双指针。

两端的 C 个人分别储存在两个最小堆里即可。

哪个最小堆被选中了,对应的指针移动一次即可。

注意事项:同一个人只能进入一个最小堆。

四、最小移动总距离

题意:给 n 个工厂和 m 个机器人的位置,每个工厂最多容纳若干机器人。
每个机器人可以移动到某个工厂,问如何分配工厂与机器人的关系,才能使得机器人的移动距离最短。

思路:典型的动态规划问题。

可以证明,如果最后一个工厂可以容纳若干机器人,则这些机器人肯定是最后连续的那几个机器人。
依次递推,最优答案肯定是若干连续的机器人分配给某个工厂,后面的机器人分配给后面的工厂,前面的机器人分配给前面的工厂。
工厂与机器人的连线不会存在交叉的情况。

状态定义:f(i, j) 前 i 个工厂容纳前 j 个机器人的最短移动距离。

转移方程:

f(i, j) = min(f(i-1, k-1) + F(i, k, j))

方程解释:枚举第 i 个工厂容纳 [k, j] 范围的机器人的答案,取最优值。

状态:F(i, k, j) 可以通过前缀和预处理计算得到。

复杂度:O(n^3)

五、最后

这次比赛最后一题其实有点难度,你是怎么做的呢?

加油,算法人。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越