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

109 阅读2分钟

问题分析

步长的变化限制

  • 起始步长和终止步长必须是1。
  • 中间的每一步步长只能在前一步的基础上调整为 -10 或 +1

为了更清晰地理解这个问题,我们可以通过简单的模拟来分析。考虑一些样例,理解步长的选择与如何变化。

思路

  1. 计算位置差:首先计算目标位置和起始位置的差值 diff = |y - x|,即我们需要移动的总距离。

  2. 模拟步数的增长

    • 每一步的步长可以逐渐增大,但不能超过前一步的步长加1。
    • 从位置 x 到 y 的最少步数其实是问题的核心。
    • 设步长为1、2、3...等逐步增加,直到总和大于或等于 diff 为止。
  3. 总步数与差值:我们通过逐步增加步长,模拟步数的增加过程。假设经过 k 步后,总的步长和大于或等于 diff。然后考虑如何调整这些步长,使得最终位置恰好为 y

代码实现

image.png

解释

  1. diff = abs(y - x) :首先我们计算起始位置 x 和目标位置 y 之间的距离。因为步长是绝对值范围,所以我们关心的是这个距离的大小。
  2. 逐步增加步长:通过 steps 变量来控制步数,每步增加 1, 2, 3, ... 直到 step_sum(步长的总和)达到或超过目标距离 diff
  3. 步长差值调整:在某些情况下,虽然步长总和大于或等于 diff,但差值 (step_sum - diff) 可能为奇数。为了使得最终位置恰好为 y,我们需要确保 (step_sum - diff) % 2 == 0,即差值是偶数,这样我们才能通过适当调整步长来精确到目标位置。

复杂度分析

  • 时间复杂度:每次我们增加步长,步长的增长是线性的,因此总的步数大约为 sqrt(2 * diff),复杂度大约是 O(sqrt(diff))。
  • 空间复杂度:由于我们只用了常数空间存储变量,空间复杂度是 O(1)。

示例

image.png 应当考虑输入为零的情况

image.png

总结

这个问题是一个典型的步长变化限制问题,题目给定了一个从整数位置 x 到整数位置 y 的问题,需要在每一步中移动一定的步长,而步长的选择有一定的限制。首尾两步的步长必须为1,而中间的步长只能是前一步的步长的 -10+1,即每一步的步长变动范围是有限制的。我们需要求出从 xy 的最小步数,通过逐步模拟步长增加和调整,最终确定最小步数。我们通过计算当前位置与目标位置的差值,然后逐步增加步长直到满足条件,最后输出最小步数。