leetcode 第 334 场算法比赛

作者: | 更新日期:

敲代码时总是卡顿,说明算法还没想好。

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

零、背景

以后写代码的时候,一定要先想好。

之前总是看一眼题目就敲代码,敲了一半发现不可行,这样就浪费很多时间。

一、左右元素和的差值

题意:给一个数组,问所有位置的前缀和和后缀和的差的绝对值。

思路:预处理出前缀和,总和减前缀和就是后缀和,求差的绝对值即可。

PS:前缀和后缀求差,此时前缀和后缀是否包含当前元素无所谓了,很有意思的性质。

二、找出字符串的可整除数组

题意:给一个纯数字组成的字符串,问前缀字符串对应的数字是否能整除 m.

思路:取模运算有一个性质,数字加减若干个 mod 的倍数,不影响取模结果。

所以,边取模边判断是否能整除即可。

pre = (pre * 10 + v) % m  

三、求出最多标记下标

题意:给一个数组,问是否可以选择若干组不相关的下标,使得每组下标对于的值满足2 * nums[i] <= nums[j]
问最多可以选出多少组。

思路:分析一下,如果答案为 k 组,则肯定是选择最小的 k 个数字和最大的 k 个数字进行匹对。

由此可以想到二分答案,判断是否满足匹配。

四、在网格图中访问一个格子的最少时间

题意:给一个网格,值代表访问网格的最小时间。
起点在左上角,每一秒必须上下左右选择一个方向进行移动,到达方格时时间大于网格的最小时间。
问是否可以到达右下角,可以的话求最小时间。

思路:如果起点可以出发移动一步,则来回移动,即可把时间变得无限大,从而到达右下角。
所以没有答案的条件是初始点无法起步。

方格有答案求最小值,典型的广度优先搜索。

不过在搜索之前需要先解决来回移动环的问题。

存在的环的原因是通过来回移动增大当前方格的时间,从而使得到达下个方格的时间满足最小时间这个条件。
对于网格,可以发现环的长度都是偶数,最小为 2。
所以来回移动到达下个方格的时间是可以计算出来的,即不断的加 2,直到满足条件。

于是,通过直接计算未来到达下个方格的最小时间,就可以消除广度优先搜索的环了。

五、最后

这次比赛题目其实也不难。

我也发现自己做题慢的一个原因:敲代码的时候没想好算法。

以后比赛,我做题前会先去想好算法,确认没问题了,再去敲代码。

这样应该可以节省很多时间吧。

《完》

-EOF-

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

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

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

tiankonguse +
穿越