Three stones are on a number line at positions a
, b
, 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 <= a <= 100
1 <= b <= 100
1 <= c <= 100
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;
}
};