伴学笔记之题解1 | 豆包MarsCode AI刷题

57 阅读2分钟

题目解析

题目要求从整数位置xxx_x 移动到整数位置 yyy_y ,移动的规则是每步的步长必须是连续整数(变化范围是 -1、0 或 +1),且首步和末步的步长必须是 1。需要求出从 xxx_xyyy_y 的最少步数。

解题思路

1. 问题建模

将问题看作一段路径的移动,满足以下约束:

  • 起始步长为 1,末尾步长也为 1;
  • 步长之间连续,差值只能是 −1、0 或 +1。

2. 观察特点

  • 如果路径较短,步长可能是121 1 \to 2 \to 1,即形成一个上升和下降的模式;
  • 如果路径较长,步长可能呈现更复杂的变化,比如 123211 \to 2 \to 3 \to 2 \to 1

这要求我们控制步长的增长和减少,保证移动的总距离正好等于 |y - x|。

3. 贪心策略

为了最小化步数:

  • 尽可能增加步长,因为增加步长会更快缩短两点间的距离;
  • 平滑地过渡到减少步长,避免多余的移动。

4. 核心公式

考虑步长序列 1,2,…,k1,2,,kk_{1, 2, \ldots, k}其前 kk 步的总距离为:

Sk=1+2++k=k(k+1)2S_k = 1 + 2 + \ldots + k = \frac{k \cdot (k + 1)}{2}

  1. SkS_k 超过或等于 |y - x| 时,停止步长增加。
  2. 调整最后几步,使得总距离正好等于 |y - x|。

解法实现

算法步骤

  1. 计算目标距离distance=yx\text{distance} = |y - x|
  2. 寻找最大步长:找到 k,使得 SkS_k 最接近且不小于 distance\text{distance}
  3. 调整步数:若 Sk>distanceS_k > \text{distance},通过减少某些步长来补偿多余的距离。

代码实现(Python)

def min_steps(x, y):
    distance = abs(y - x)
    step = 0
    total_distance = 0

    # 累积步长,直到超过或等于目标距离
    while total_distance < distance:
        step += 1
        total_distance += step

    # 检查多余的步长是否需要调整
    while (total_distance - distance) % 2 != 0:  # 调整步数使得多余部分为偶数
        step += 1
        total_distance += step

    return step

# 示例测试
print(min_steps(12, 6))  # 输出: 4
print(min_steps(34, 45))  # 输出: 6

复杂度分析

  1. 时间复杂度:步长增长是线性的,时间复杂度为 O(distance)。
  2. 空间复杂度:仅使用常数变量,空间复杂度为 O(1)。

示例解释

示例 1

输入:x=12,y=6,distance=6x = 12, y = 6,\text{distance} = 6

  1. 步长序列:1→2→2→1,总步数为 4。
  2. 输出:4。

示例 2

输入:x=34,y=45,distance=11x = 34, y = 45,\text{distance} = 11

  1. 步长序列:1232211 \to 2 \to 3 \to 2 \to 2 \to 1,总步数为 6。
  2. 输出:6。

总结

这道题的关键在于利用贪心策略以及数列和,选择最优的步长增加模式,同时通过调整补偿额外的移动,从而最小化总步数。 通过这道题,巩固了python实现算法题的技巧与语法,期待能探索出其他知识点。