计算从位置x到位置y的最小步数 | 豆包 MarsCode AI 刷题

141 阅读3分钟

问题重述

目标

确定从整数位置 x 移动到整数位置 y 的最少步数。

移动规则

1.每一步的移动可以是上一步的步长减 1、保持不变或加 1
2.起始和结束步的步长必须是 1

输入输出:

输入:两个整数 x 和 y,分别代表起始和目标位置。
输出:从 x 移动到 y 所需的最小步数。

思路分析

这道题目比较的简单,注意如何进行边界条件处理以及注意终止条件即可

  1. 边界条件处理:首先检查x和y的大小关系,确保x不大于y,如果不是,则交换它们。
  2. 双指针遍历:使用左指针l和右指针r分别指向当前位置和目标位置(y-x)的终点。通过循环,逐步尝试通过不同步数的跳跃来接近或达到右指针位置。
  3. 跳跃策略:在每一步中,根据当前步长(stepDistance)计算下一可能到达的位置m,并判断从m到r的距离是否允许以递减的步长(1、2、3步减1)完成剩余距离。选择能最远到达且合法(剩余距离能覆盖)的步长作为下一步的步长。
  4. 终止条件:当左指针l达到或超过右指针r时,循环结束,此时的总步数即为所求的最小步数。

代码分析

  1. 定义 sum函数,它计算从 1 到 x 的所有整数的和。如果 x 小于或等于 0,则返回 0。
def sum(x):
    if x <= 0:
        return 0
    res = 0
    for i in range(1, x + 1):
        res += i
    return res
  1. 定义 solution 函数,并进行了初始化。首先检查 x 和 y 的大小关系,如果 x 大于 y,则交换它们。然后,它初始化了左指针 l(从 0 开始),右指针 r(表示从 x 到 y 的距离),步数 step(初始为 0),以及当前步长 step_distance(初始为 0)。
def solution(x, y):
    if x > y:
        x, y = y, x
    l = 0
    r = y - x
    step = 0
    step_distance = 0
  1.  solution 函数的核心部分包含一个 while 循环,用于逐步接近或达到右指针位置。在循环中,它首先处理特殊情况(即第一步),然后计算三种可能的下一步长(step1step2 和 step3),并根据条件判断和更新当前位置 l、步数 step 和当前步长 step_distance
while l < r:
        if step == 0:
            step_distance = 1
            step = 1
            l += step_distance
            continue

        step1 = step_distance + 1
        step2 = step_distance
        step3 = step_distance - 1

        if l + step1 < r:
            m = l + step1
            s = sum(step1 - 1)
            if (r - m) >= s:
                l = m
                step += 1
                step_distance = step1
                continue
        if l + step2 <= r:
            m = l + step2
            s = sum(step2 - 1)
            if (r - m) >= s:
                l = m
                step += 1
                step_distance = step2
                continue
        if l + step3 <= r:
            m = l + step3
            s = sum(step3 - 1)
            if (r - m) >= s:
                l = m
                step += 1
                step_distance = step3
                continue

    return step
  1. 主程序进行样例检测
if __name__ == "__main__":
    # Add your test cases here
    print(solution(6, 7) == 1)      # Should print True
    print(solution(12, 6) == 4)     # Should print True
    print(solution(34, 45) == 6)    # Should print True
    print(solution(50, 30) == 8)     # Should print True

总结

通过编写Python代码实现了计算从x到y(x≤y)所需的最小跳跃步数。通过定义sum函数计算连续自然数和,solution函数则采用贪心算法动态调整步长,寻找最优解。