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