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
第一部分,什么情况下第一种选择最优
后面是选择了中心点下标后快速计算,我们通过下标计算距离,前后可以抵消当前坐标的加减,这样我们简化后可以直接计算前缀和来优化坐标计算