3086. Minimum Moves to Pick K Ones

3086. Minimum Moves to Pick K Ones

class Solution:
    def minimumMoves(self, nums: List[int], k: int, maxChanges: int) -> int:
        t=max((len(list(g))for k,g in groupby(nums)if k==1),default=0)
        t=min(t,3)
        if k<=maxChanges+t:
            if k<=t:return k-1

            if t>0:
                return t-1+2*(k-t)
            else:
                return 2*k
        
        k-=maxChanges

        psums=list(accumulate((i for i,x in enumerate(nums) if x==1),initial=0))
        res=inf
        for i in range(k,len(psums)):
            j=i-(k+1)//2
            res=min(res,psums[i]-psums[i-k//2]-(psums[j]-psums[j-k//2]))
        return res+maxChanges*2
            

第一部分,什么情况下第一种选择最优

后面是选择了中心点下标后快速计算,我们通过下标计算距离,前后可以抵消当前坐标的加减,这样我们简化后可以直接计算前缀和来优化坐标计算

https://leetcode.com/problems/minimum-moves-to-pick-k-ones/solutions/4886166/python3-clean-code-sliding-window-nothing-fancy/?envType=company&envId=tiktok&favoriteSlug=tiktok-three-months

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值