移动石子直到连续【LC1033】
三枚石子放置在数轴上,位置分别为
a,b,c。每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这三枚石子当前分别位于位置
x, y, z且x < y < z。那么就可以从位置x或者是位置z拿起一枚石子,并将该石子移动到某一整数位置k处,其中x < k < z且k != y。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。
要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:
answer = [minimum_moves, maximum_moves]
要赶紧回归学习状态
-
思路
排序后分类讨论
-
最大移动次数【贪心】
每次向中间十字移动一格,使移动次数最大
-
最小移动次数【分情况讨论】
由于可以移动至任意位置,因此最小次数最多为2
- 如果三颗石子已经连续,那么不需要移动
- 如果三颗石子两颗连续 ,那么只需移动1次
- 如果两颗石子距离为1,那么只需移动1次
- 否则,移动2次
-
-
实现
class Solution { public int[] numMovesStones(int a, int b, int c) { int[] stones = {a, b, c}; Arrays.sort(stones); int[] res = new int[2]; res[1] = stones[2] - stones[0] - 2;// 最大 // 最小 // 已经连续 0次 // 两颗连续 1次 // 两颗相邻为1 1次 // 否则 移动2次 if(stones[2] - stones[0] == 2){ res[0] = 0; }else if (stones[2] - stones[1] <= 2 || stones[1] - stones[0] <= 2){ res[0] = 1; }else { res[0] = 2; } return res; } }- 复杂度
- 时间复杂度:O(1)O(1)O(1)
- 空间复杂度:O(1)O(1)O(1)
- 复杂度

这是一个关于移动石子的游戏策略问题,目标是计算使石子位置连续所需的最小和最大移动次数。最大移动次数可以通过每次都向中间位置移动来达到。最小移动次数则需要根据石子的初始位置分情况讨论,包括已经连续、两颗连续、两颗相邻或不相邻的情况。解决方案是一个O(1)时间复杂度和空间复杂度的算法。

被折叠的 条评论
为什么被折叠?



