石子移动问题|豆包MarsCode AI刷题

104 阅读2分钟

关键点

  1. 端点石子:每次只能移动位置最小或最大的石子。
  2. 连续位置:最终所有石子需要占据连续的位置。

解题思路

  1. 排序:首先对 stones 数组进行排序,这样可以更容易地找到端点石子。

  2. 计算最大移动次数

    • 最大移动次数可以通过计算当前石子位置与理想连续位置之间的差距来确定。
    • 理想情况下,石子应该占据 [min(stones), min(stones) + n - 1] 这个区间,其中 n 是石子的数量。
    • 计算当前石子位置与理想位置之间的最大差距,然后减去石子的数量 n 减去 1(因为理想情况下,石子应该占据 n 个连续位置)。
  3. 滑动窗口

    • 使用滑动窗口来计算最小移动次数。滑动窗口可以帮助我们找到一个区间,使得在这个区间内的石子数量最多,且区间长度为 n1. - 如果窗口内的石子数量已经达到 n - 1,且窗口长度为 n - 1,则只需要移动两次(一次移动到窗口的左边,一次移动到窗口的右边)。

总结

通过排序和滑动窗口,可以计算出最大和最小的移动次数。最大移动次数表示在最坏情况下需要移动的次数,而最小移动次数表示在最优情况下需要移动的次数。使用滑动窗口来计算最小移动次数的原因在于,滑动窗口可以帮助我们有效地找到一个区间,使得在这个区间内的石子数量最多,且区间长度为 n。这样我们可以确定在最优情况下需要移动的次数。

详细解释

  1. 区间长度:需要找到一个长度为 n 的区间,使得在这个区间内的石子数量最多。因为最终所有石子需要占据连续的位置,所以这个区间长度应该是 n

  2. 滑动窗口的优势

    • 动态调整:滑动窗口可以在数组中动态地调整窗口的起始和结束位置,从而找到包含最多石子的区间。
    • 高效性:滑动窗口的时间复杂度为 O(n),因为我们只需要遍历数组一次,并且在每次遍历中只需要常数时间来调整窗口的起始和结束位置。
  3. 计算最小移动次数

    • 当找到一个包含 n - 1 个石子的区间,且区间长度为 n - 1 时,只需要移动两次(一次移动到窗口的左边,一次移动到窗口的右边)。
    • 如果窗口内的石子数量已经达到 n - 1,且窗口长度为 n - 1,则只需要移动两次。