问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
输入描述
输入包含两个整数 x 和 y,表示起始位置和目标位置。
输出描述
输出从 x 到 y 所需的最小步数。
测试样例
样例1:
输入:x_position = 12, y_position = 6 输出:4
样例2:
输入:x_position = 34, y_position = 45 输出:6
样例3:
输入:x_position = 50, y_position = 30 输出:8
样例4:
输入:x_position = 0, y_position = 0 输出:0
解题思路
-
首先处理特殊情况:如果起点等于终点,直接返回0。
-
为了简化问题,我们统一处理成从小数到大数的情况。如果x大于y,我们交换它们的位置(因为路径是对称的)。
-
核心算法:
-
从步长1开始
-
每一步可以在前一步的基础上选择-1、0或+1
-
计算每一步能达到的最大距离
-
当最大距离超过目标距离时,检查是否需要额外的步数来满足最后一步必须是1的条件
-
最后返回所需的最小步数
代码演示
def min_steps(x_position: int, y_position: int) -> int:
# 如果起点等于终点,直接返回0
if x_position == y_position:
return 0
# 为了统一处理,确保x始终小于y
if x_position > y_position:
return min_steps(y_position, x_position)
distance = y_position - x_position
# 计算最小步数
steps = 1
current_max = 1 # 当前可以达到的最大距离
while current_max < distance:
steps += 1
# 每一步可以在前一步的基础上-1,0,+1
current_max += steps
# 如果最后一步不是1,可能需要多走几步
while (current_max - distance) % 2 != 0:
steps += 1
current_max += steps
return steps
最后总结
-
确保最后能够精确到达目标位置
-
如果当前最大距离和目标距离的差不是偶数,需要额外的步数来调整
-
举例说明
比如要从12移动到6(距离为6):
-
第1步:可以移动1(必须)
-
第2步:可以移动2
-
第3步:可以移动3
-
第4步:可以移动4
这样通过适当选择每步的具体移动(是选择-1、0还是+1),就能精确到达目标位置。这个算法的优点是:
-
时间复杂度为O(√n),其中n是距离
-
空间复杂度为O(1),只使用了常数空间