sliding window。window大小设置为总的1的个数,假定为Z,原因是咱们的目的是把1都聚在一起,那么如果在Z大长度内,含有最多的1,需要swap的1就少。一种办法,就是每次把nums的0到Z-2位置内的元素复制,append到nums尾部(circulate的array)。然后滑动窗口后,计算新窗口内的1.当然,这里就存在重复计算。每次滑动后,把滑进来的元素+到远窗口的sum中,同时减去离开窗口的元素值即可。同时,circulate的部分,用%操作就可以了。
class Solution:
def minSwaps(self, nums: List[int]) -> int:
total = windowsize = sum(nums)
cursum = sum(nums[:windowsize])
res = total - cursum
for i in range(len(nums)):
j = (i + windowsize)%len(nums)
cursum += nums[j]
cursum -= nums[i]
res = min(res, total - cursum)
return res
class Solution:
def minSwaps(self, nums: List[int]) -> int:
total = windowsize = sum(nums)
cursum = sum(nums[:windowsize])
res = total - cursum
tail = nums[0:windowsize-1]
nums = nums + tail
for i in range(len(nums)-windowsize):
j = (i + windowsize)
cursum += nums[j]
cursum -= nums[i]
res = min(res, total - cursum)
return res
total = windowsize = sum(nums)
cursum = sum(nums[:windowsize])
res = total - cursum
for i in range(len(nums)):
j = (i + windowsize)%len(nums)
cursum += nums[j]
cursum -= nums[i]
res = min(res, total - cursum)
return res