题目:

在一根无限长的数轴上,你站在0的位置。终点在target的位置。
你可以做一些数量的移动 numMoves :
	每次你可以选择向左或向右移动。
	第 i 次移动(从  i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。

示例:

输入:target = 2

输出:3

第一次移动,从 0 到 1.

第二次移动,从 1 到 -1.

第三次移动,从 -1 到 2.

题目解读:

【移动方向】想左或者向右移动

【移动距离】第几次移动就移动多远

​ 第一步,移动距离1

​ 第二步,地洞距离2

​ 第三步,移动距离3

​ …

​ 第N步,移动距离N

我们要从起点以最小移动次数达到 target

从起点到达 target 的几种可能

  1. 向着一个方向一直移动就能达到 target ,此时直接返回 numMoves.
  2. 需要向左右两边移动到达 target ,移动 numMoves 到达 target.

解题思路:

第一种情况我们就不说了。

第二种情况:

LC754

首先将 target 转换成正数,因为 targte 正负的操作都一样,只是移动的方向不一样,为了方便计算,我们直接将其转换成整数。 Python 中的 abs()

从以上图中得到一个结论,若沿着一个方向移动会超过 target 那么我们中间一定是要向相反的方向移动。

那么只要我们 移动总数 超过 target 偶数,那么我们就可以通过将 + 改成 - 到达 targte

解题思路:

1
2
3
4
5
6
def reachNumber(target: int) -> int:
target, num_sum, numMoves = abs(target), 0, 0
while num_sum < target or (num_sum - target) % 2 != 0:
numMoves += 1 # 步数
num += numMoves # 移动总距离
return numMoves
1
2
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reach-a-number