https://leetcode-cn.com/problems/minimum-swaps-to-group-all-1s-together-ii/
这题如果没有理清楚思路的话,写起来会非常痛苦,各种corner cases. 如果换个角度看待这个问题就会简单很多。
如果把这个问题看做是,我们设定一个窗口,要把所有的1都放入这个窗口的话,那么需要移动多少个1.
UPDATE:我在想是不是针对所有这类环形数组的题目,都应该从滑动窗口考虑?因为环形数组通常需要将两个数组连接起来简化问题,配合滑动窗口是很自然的操作。
class Solution:
def minSwaps(self, nums: List[int]) -> int:
loop = nums + nums
exp = sum(nums)
zero = exp - sum(loop[:exp])
ans = zero
for i in range(exp, len(loop)):
if loop[i] == 0:
zero += 1
if loop[i - exp] == 0:
zero -= 1
ans = min(ans, zero)
return ans