LeetCodeDiary

A Diary for solving LeetCode problems

View on GitHub
'''
Description: 
Autor: Au3C2
Date: 2020-12-04 14:54:44
LastEditors: Au3C2
LastEditTime: 2020-12-04 14:58:00
'''
class Solution:
    def numMovesStonesII(self, stones: List[int]) -> List[int]:
        stones.sort()
        n = len(stones)
        #最大值
        maxs = stones[n-1]-stones[0]+1-n- \
            min(stones[n-1]-stones[n-2]-1,stones[1]-stones[0]-1)
        #最小值
        mins = maxs
        tmp = 0
        for i in range(n):
            while stones[i]-stones[tmp]+1>n:
                tmp += 1
            cost = n-(i-tmp+1)
            if cost == 1 and \
                stones[i]-stones[tmp]+1 == n-1: # 左端致密情况
                mins = min(mins,2)
            else:
                mins = min(mins,cost) # 一般情况
        return [mins,maxs]

# 这题做得太久了,而且一开始没有往滑窗方向思考,tag还是很重要的。
# 我的策略也不是最优的,较优的答案参考:
# https://leetcode-cn.com/problems/moving-stones-until-consecutive-ii/solution/python3shuang-zhi-zhen-hua-dong-chuang-kou-by-gori/