豆包MarsCode AI刷题

46 阅读3分钟

石子移动问题

问题描述:小S正在玩一个关于石子的游戏,给定了一些石子,它们位于一维数轴的不同位置,位置用数组 stones 表示。如果某个石子处于最小或最大的一个位置,我们称其为端点石子。 在每个回合,小S可以将一颗端点石子移动到一个未占用的位置,使其不再是端点石子。游戏继续,直到石子的位置变得连续,无法再进行任何移动操作。 你需要帮助小S找到可以移动的最大次数。

题目解析

首先我们要分析问题:我们有一个数组 stones,表示石子在数轴上的位置,端点石子是指位于数组最左边和最右边的石子,我们可以将端点石子移动到任何未占用的位置,但不能移动中间的石子,目标是最大化移动次数,直到无法再移动为止。

逐步解析并编写代码

因为我们的静态方法 solution,它接受一个整数数组 stones 作为参数。因此,我们首先进行特殊情况处理,判断如果数组中只有一个石子,那么无法进行任何移动,因此直接返回0,然后对正常的石子的位置进行排序,以便更容易地处理端点石子,计算最大移动次数。首先,获取石子的数量 n。然后计算两端石子之间的距离,stones[n - 1] - stones[1] 表示右边端点石子和第二右边石子之间的距离,stones[n - 2] - stones[0] 表示左边端点石子和第二左边石子之间的距离。取这两个距离的最大值,然后减去 n - 2(因为两端的石子不能同时移动),得到最大移动次数,接着使用while 循环,尝试扩大窗口,直到窗口内的石子数量加上窗口外的石子数量超过 n,通过判断如果窗口内的石子数量正好是 n - 1,并且窗口的跨度正好是 n - 1,那么这是一个特殊情况,因为这意味着只有一个空位,此时最小移动次数为2,否则,计算最小移动次数,即总石子数 n 减去窗口内已经排好的石子数。最后,方法返回计算出的最大移动次数。

核心要点

每次移动都会减少一个端点石子,因为一旦移动,它就不再是端点石子了,当所有石子都连续排列时,就不能再移动了,因为此时没有端点石子,一个直观的策略是,每次移动时,都尽量将端点石子移动到离当前端点较远的位置,这样可以为后续的移动留出更多的空间。通过测试,我的代码运行成功