題目內容
- 原題鏈接:https://leetcode-cn.com/contest/weekly-contest-134/problems/moving-stones-until-consecutive/
- 題目內容
三枚石子放置在數軸上,位置分別爲 a,b,c。
每一回合,我們假設這三枚石子當前分別位於位置 x, y, z 且 x < y < z。從位置 x 或者是位置 z 拿起一枚石子,並將該石子移動到某一整數位置 k 處,其中 x < k < z 且 k != y。
當你無法進行任何移動時,即,這些石子的位置連續時,遊戲結束。
要使遊戲結束,你可以執行的最小和最大移動次數分別是多少? 以長度爲 2 的數組形式返回答案:answer = [minimum_moves, maximum_moves]
示例 1:
輸入:a = 1, b = 2, c = 5
輸出:[1, 2]
解釋:將石子從 5 移動到 4 再移動到 3,或者我們可以直接將石子移動到 3。
示例 2:
輸入:a = 4, b = 3, c = 2
輸出:[0, 0]
解釋:我們無法進行任何移動。
提示:
1 <= a <= 100
1 <= b <= 100
1 <= c <= 100
a != b, b != c, c != a
解題思路
首先對a, b, c三個數進行從大到小排序
-最小的移動次數爲1有以下情況:
- a+1=c and b+1!=c
- a+1!=c and b+1=c
- b-a=2 or c-b=2 這種情況如1, 3, 5直接將1上的石子放在4的位置上只需要移動一次
- 最大移動次數只需要將最大位置的石子和最小位置的石子依次一格一格往中間位置的石子移動即可。
class Solution(object):
def numMovesStones(self, a, b, c):
"""
:type a: int
:type b: int
:type c: int
:rtype: List[int]
"""
alist = [a, b, c]
alist = sorted(alist)
minmove, maxmove = 0, 0
if alist[0] + 1 != alist[1]:
minmove += 1
maxmove += alist[1] - alist[0] -1
if alist[1] + 1 != alist[2]:
minmove += 1
maxmove += alist[2] - alist[1] -1
if alist[1] - alist[0] == 2 or alist[2] - alist[1] == 2:
minmove = 1
return [minmove, maxmove]