题目解析-计算从位置 x 到 y 的最少步数
1.可以进行问题简化, 想要搞懂这道题的解法,必须先读懂这道题是什么意思,它说从整数x移动到y,每一步可以增加或者减少,每一步必须是上一的-1,+0 或 +1, 但其实这里的负数可以不管,因为即便是负距离,它和正距离的步长其实是一样的。所以我们只需要考虑最快的方法,
2.在这个问题上,一个很重要的点就是:首末两步的步长必须是 1,这就要考虑什么样的情况才会首末两个步长都为1了,
3.我们可以考虑在这两个条件下如何才是最快的,我们以x=1,y=10为例,它们的距离是9,因此最快的方法肯定是这样的,只需要5步,呈现一个金字塔的形状
,这这种金字塔的模式,就会满足(*距离 ** 0.5) × 2 - 1 =步长
4.当然,这只是一个特殊的例子,如果距离刚好不能满足这种金字塔的方式呢? 比如距离等于8或者距离等于10怎么办呢? 我们也可以通过画图进行理解,如果距离为8,我们也尽量让它满足对称关系,像这样也是最快的方法了, 因为一旦第三步走了3,那么第四步就达到了目的地,末位步长就会不为1了。
像这种金字塔的模式,对距离进行开方再向下取整,既满足int(距离 ** 0.5) × 2 + 1 =步长
5.那如果距离是10应该怎么办呢?,通过观察,我发现最快的方法还是要保持对称的结构,这时候步长又会增加了一步,达到6步
像这种结构,步长和距离之间的关系就更简单了,直接就int(距离 ** 0.5) × 2 =步长
6.为什么它会满足一个这样的公式呢? 我认为可以这样进行理解, 首先从图中可以知道, X到y的距离会等于每一步的步长的总和, 在对称的图形中,
情况 1: 如果想构造一个完美的金字塔形状,距离必须是一个完全平方数。即步长= 2 × (距离 ** 0.5) − 1
情况 2:如果距离不是一个完全平方数,我们需要找到一个数 n, 使得 n^2≤d<(n+1)^2。这种情况下,我们可以形成一个接近金字塔形状的结构,步数为 2n 或 2n+1。
如果 n × (n+1)< d,那么我们需要额外的一步来达到 y,所以步数为 2n+1。 否则,步数为 2n。
7.所以我们通过经过仔细观察,发现步长和距离之间存在一定的数学公式,所以这就变成了一道数学题。 最终代码如下:
def solution(x_position, y_position):
distance = abs(x_position - y_position)
if distance == 0:
return 0
steps = distance ** 0.5
steps = int(steps)
if steps ** 2 == distance: #如果distance是完全平方数, 可以构造完美的金字塔
return 2 * steps - 1
if steps * (steps + 1) < distance:
return 2 * steps + 1
return 2 * steps