leetcode_1033. Moving Stones Until Consecutive

https://leetcode.com/problems/moving-stones-until-consecutive/

题意:给定3个点,每次从两个端点(位置最小或位置最大)中挑选一个点进行移动,将其移动到原先两个端点之间的空位置上,直到3个点位置连续,问最少多少步,和最多多少步。

思路:

对于(x,y,z),x<y<z:

最多步数:

固定一端,一直选择另一端的端点移动。具体地,固定右端点,一直选择左端点进行移动,每次将左端点移动至最左边的空位置上(greedy),每一步这样的操作,消耗[x,y]区间中的一个空位置,直至用掉所有空位置;或者说每一次操作后,最新的[x1,y1]相对[x,y]长度减1,一直减到xn+2==yn。

故,最多的步数为,z-x-2。

最少步数:

若x+1=y,y+1=z,则需0步;

若y-x<=2或者z-y<=2,则需1步;

否则,需2步。

class Solution
{
public:
    vector<int> numMovesStones(int a, int b, int c)
    {
        if(a>b)
            swap(a,b);
        if(a>c)
            swap(a,c);
        if(b>c)
            swap(b,c);
        //cout<<a<<" "<<b<<" "<<c<<endl;
        if(a+1==b && b+1==c)
            return vector<int>{0,0};
        int lowerbound=0, upperbound=c-a-2;
        if(b-a<=2||c-b<=2)
            lowerbound=1;
        else
            lowerbound=2;
        //cout<<lowerbound<<" "<<upperbound<<endl;
        return vector<int>{lowerbound,upperbound};
    }
};

 

posted on 2019-05-08 18:17  JASONlee3  阅读(110)  评论(0编辑  收藏  举报

导航