其他分享
首页 > 其他分享> > leetcode 1033 移动石子直到连续

leetcode 1033 移动石子直到连续

作者:互联网


主要是需要搞清楚移动的方式,接下来就很简单了。


### 题目
三枚石子放置在数轴上,位置分别为 a,b,c。

每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < z 且 k != y。

当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。

要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]

### 思路
首先将三个数排好序,然后算出中间节点与两边节点的距离,根据距离的大小,分别对应下面的几种情况,第一种,三者互相挨着,这样距离就是1和1,无法移动,输出{0,0},第二种情况,一边是挨着的,另外一边没有挨着,这种情况就是最少移动次数一次移到挨着的位置,最多移动另一边的距离减一次,所以结果为{1,l2-1}或{l1-1,1},第三种情况,某一边是与中间节点相隔1位,那么最少移动次数为1次,只需要将边上的石子移动到中间就可以了,最多移动次数就是l1+l2-2,因为我们不确定是哪一边相隔一位,所以就写成这样的形式,第四种情况就是两边与中间节点都相隔超过一位,那么最少移动次数就是2,最多移动次数也是l1+l2-2。
### code
    vector<int> numMovesStones(int a, int b, int c) {
        int max_num=max(c,max(a,b));
        int min_num=min(c,min(a,b));
        int mid_num=a+b+c-max_num-min_num;
        int l1=mid_num-min_num;
        int l2=max_num-mid_num;
        if(l1==1&&l2==1)
        {
            return {0,0};
        }
        if(l1==1&&l2>1)
        {
            return {1,l2-1};
        }
        if(l1>1&&l2==1)
        {
            return {1,l1-1};
        }
        if(l1==2||l2==2)
        {
            return {1,l1+l2-2};
        }
        return {2,l1+l2-2};
        
    }

标签:int,石子,num,l2,l1,1033,移动,leetcode
来源: https://blog.csdn.net/m0_38071863/article/details/97623345