x到y的步数解| 豆包MarsCode AI刷题

54 阅读2分钟

问题描述

小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),只使用了常数空间