leetcode 第 271 场算法比赛

作者: | 更新日期:

题目很简单,但是差点又s翻车了。

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

零、背景

题目比较简单,本来打算半个小时写完的,结果一个小时也没写完,差点翻车。

一、环和杆

题意:给 10 个棍子和 3 个颜色的环,棍子上有环。
问哪些棍子上有三种颜色的环。

思路:循环统计即可。

二、子数组范围和

题意:给一个数组,求所有子数组中最大值与最小值的差值之和。

思路:数据量不大,枚举所有子数组,前缀相同的子数组累计计算最值即可。
复杂度:O(n^2)

三、给植物浇水 II

题意:给一排植物,两个人分别从两头顺序给植物浇水。
如果谁的水桶的水不够给当前植物浇水了,则立刻加满水。
问最后两人总共加了多少次水。

思路:从两头循环模拟即可。

四、摘水果

题意:在一个 x 轴上,给一些下标和水果数量,代表指定下标位置上有若干个水果。
现在给你一个起始下标和最大距离,问在可以向左和向右移动的时候,最多可以摘多少水果。

思路:典型的二分查找题。

总共有两种局部最优策略来摘水果。
一种是先往左走,到达某个位置后再向右走。
另一种是先向右走,到达某个位置后再向左走。

枚举这两种策略,取最优值即可。

这里以第一个策略为例来说明具体怎么二分搜索。

首先枚举的都是输入的下标,这样顶多枚举 O(n)次。
然后判断枚举的位置是否能到达,不能则没必要继续枚举了。
可以到达时,使用前缀和可以得到一个临时答案。
此时假设左半部的距离是 L

之后再判断是否可以到原点。
判断公式是 2 * L < K,复杂度 O(1)

如果可以了,就可以尝试向右走,去继续摘水果了。

右边最远可以走的距离是 start + K - 2 * K
有了最远的距离,进行二分搜索找到具体的下标。
然后使用前缀和计算出一个更大的临时答案。

最后更新最优解即可。

PS:做这道题的时候,我在纠结要不要把二分搜索从数组转化为 map
由于 mapdistanceO(N) 的复杂度,最后我最好选择数组了。

五、最后

这次比赛难度还好。
不过我翻车了。

最后一题卡了好久,虽然四道题都做完了,但是排名很靠后了。

《完》

-EOF-

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

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

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

tiankonguse +
穿越