「携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情」
今天我们来做一下leetcode上面的一道"中等题"
题目链接在这里 #### 754. 到达终点数字
题意
首先,我们需要知道这道题是个脑筋急转弯。什么意思呢? 可能开始你不明白,但是可能又一瞬间你突然懂了,原来是这样子的,只需要那一个灵感而已🤣
好了,读题,题目说了一个无限长的数轴,我们站在数轴0点处,有一个目标点位于target,我们需要经过若干次移动到达那里。如何移动呢? 移动步数,从1开始增加,也就是下一次移动的距离必须是这次移动距离+1,移动方向可以是向前也可以是向后。 然后,问我们最少移动多少次可以到达target
思路
这道题,乍一看,无从下手,因为你不好确定如何才能到达target,而且方向可以向前也可以向后。
a.但是,我们不妨可以这样想,如果target都是正数,也就是都在0点的右侧,我们始终沿着向右的方向移动,那么在移动n次之后,我们就可以超过target了。可以确定的是,当前的移动次数n一定是超过target时的最小移动次数,这一点毋庸置疑。
b.超过target之后,我们可以在想一下,如果超过的距离是偶数会怎么样呢? 比如超过了 2 3 12 8 这种
c.这里打断一下,在此之前还需要知道的一点是,如果我们一直向右移动,移动n次后,将第一次的方向换成向左的,那么会发生什么呢? 其实,就是当前的位置会向左移动 2*1 个单位
知道了这一点之后,在回到[步骤b] 如果超过了偶数的距离的话,我们是不是总能 通过 反转 第n/2第移动的方向,来达到将当前位置向后移动n距离的目的(因为第n次移动,移动的距离也是n)。向后移动n距离之后会发生什么呢? 我们惊奇的发现已经和终点target重合了,而且在步骤a我们知道当前的移动次数是最小的,我们只不过改变了其中某次移动的方向而已。
至此,就分析完了知道脑筋急转弯。
代码实现
结束语
做过这道题之后,可以发现,脑筋急转弯类的题目,有时候缺少的就是那一瞬间的灵感罢了。
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄