LC 2134. 最少交换次数来组合所有的 1 II

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