題目鏈接
難度:中等 ??????類型:數(shù)組、滑動窗口
在一個長度無限的數(shù)軸上,第 i 顆石子的位置為 stones[i]。如果一顆石子的位置最小/最大,那么該石子被稱作端點石子。
每個回合,你可以將一顆端點石子拿起并移動到一個未占用的位置,使得該石子不再是一顆端點石子。
值得注意的是,如果石子像 stones = [1,2,5] 這樣,你將無法移動位于位置 5 的端點石子,因為無論將它移動到任何位置(例如 0 或 3),該石子都仍然會是端點石子。
當(dāng)你無法進行任何移動時,即,這些石子的位置連續(xù)時,游戲結(jié)束。
要使游戲結(jié)束,你可以執(zhí)行的最小和最大移動次數(shù)分別是多少? 以長度為 2 的數(shù)組形式返回答案:answer = [minimum_moves, maximum_moves] 。
示例1
輸入:[7,4,9]
輸出:[1,2]
解釋:
我們可以移動一次,4 -> 8,游戲結(jié)束。
或者,我們可以移動兩次 9 -> 5,4 -> 6,游戲結(jié)束。
示例2
輸入:[6,5,4,3,10]
輸出:[2,3]
解釋:
我們可以移動 3 -> 8,接著是 10 -> 7,游戲結(jié)束。
或者,我們可以移動 3 -> 7, 4 -> 8, 5 -> 9,游戲結(jié)束。
注意,我們無法進行 10 -> 2 這樣的移動來結(jié)束游戲,因為這是不合要求的移動。
示例3
輸入:[100,101,104,102,103]
輸出:[0,0]
解題思路
1.排序
2.最大值:max(移到最左,移到最右)
3.最小值:
- 連續(xù)值a<總長度n,外面有幾個值就移幾步,所有可能去最小
- 連續(xù)值a == n-1, 移動2步即可
代碼實現(xiàn)
class Solution(object):
def numMovesStonesII(self, stones):
"""
:type stones: List[int]
:rtype: List[int]
"""
stones.sort()
i, n = 0, len(stones)
min_moves = n
max_moves = max(stones[-1]-stones[1], stones[-2]-stones[0])-n+2
for j in range(n):
while stones[j]-stones[i] >= n:
i += 1
if j-i+1 == n-1 and stones[j]-stones[i]==n-2:
min_moves = min(2, min_moves)
else:
min_moves = min(min_moves, n-(j-i+1))
return [min_moves, max_moves]