1033. Moving Stones Until Consecutive

Three stones are on a number line at positions ab, and c.

Each turn, you pick up a stone at an endpoint (ie., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints.  Formally, let's say the stones are currently at positions x, y, z with x < y < z.  You pick up the stone at either position x or position z, and move that stone to an integer position k, with x < k < z and k != y.

The game ends when you cannot make any more moves, ie. the stones are in consecutive positions.

When the game ends, what is the minimum and maximum number of moves that you could have made?  Return the answer as an length 2 array: answer = [minimum_moves, maximum_moves]

 

Example 1:

Input: a = 1, b = 2, c = 5
Output: [1,2]
Explanation: Move the stone from 5 to 3, or move the stone from 5 to 4 to 3.

Example 2:

Input: a = 4, b = 3, c = 2
Output: [0,0]
Explanation: We cannot make any moves.

Example 3:

Input: a = 3, b = 5, c = 1
Output: [1,2]
Explanation: Move the stone from 1 to 4; or move the stone from 1 to 2 to 4.

 

Note:

  1. 1 <= a <= 100
  2. 1 <= b <= 100
  3. 1 <= c <= 100
  4. a != b, b != c, c != a

题意:有三个石子,分别放在a,b,c位置处。可以移动某个石子,问最少移动多少次可以使a,b,c三者相邻;最多移动多少次,可以使a,b,c相邻。

思路:先对a,b,c进行一下排序,若初始时,a,b,c都相邻,只需0次。若已有两个元素相邻,则将另一个移动即可,最少1次,最多距离-1次。若都不相邻,最少2次即可(移动两端与中间元素相邻)。最多距离-2次。

class Solution {
public:
    vector<int> numMovesStones(int a, int b, int c) {
        vector<int>vec;
        int aa[5];
        aa[0]=a;
        aa[1]=b;
        aa[2]=c;
        sort(aa,aa+3);
        a=aa[0];
        b=aa[1];
        c=aa[2];
        if(b-a==1&&c-b==1)
        	vec.push_back(0);
        else if(b-a==1||c-b==1||b-a==2||c-b==2)
        	vec.push_back(1);
        else
        	vec.push_back(2);
        vec.push_back(c-a-2);
        return vec;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值