【leetcode】NO.2134. 最少交换次数来组合所有的 1 II (Python)[周赛]

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

解题思路

先统计滑动窗口内1的个数的最大值,利用滑动窗口大小-之后得到的是0的个数的最小值

  1. 解决环形问题:原数组加倍
  2. 统计原数组的长度,作为滑动窗口;
  3. 向右滑动过程中右侧进入如果是1,1的个数+1,如果是0,1个数+0;
  4. 向右滑动过程中左侧出去如果是1,1的个数-1,如果是0,1的个数-0;
  5. 更新最大值
  6. 用窗口大小- 最大值得到交换次数最小值;

代码

class Solution:
    def minSwaps(self, nums: List[int]) -> int:
        # 统计1的个数作为滑动窗口大小
        wsize = sum(nums)
        # 换下拼接2个数组
        n2 = nums + nums
        # 设置交换次数初始值
        swap = sum(n2[:wsize]) # 也就是第一个窗口内1的个数 最后用窗口大小-1的个数得到0的个数
        max_s = swap # 窗口内1的最大值
        for i in range(1, len(nums)):
            swap += n2[i+wsize-1] # 向右边滑动的过程,进来窗口的数字如果是1,那么1的数量+1如果是0,加0,也就是1的数量不变
            swap -= n2[i-1] # 向右边滑动的过程中如果左边出窗口的数字是1,则窗口内1的个数-1;如果是0,则-1也就是不变
            if swap>max_s:
                max_s = swap # 求窗口内1的个数最大值,反过来也就是0的在窗口内的最小值,也就是最小交换次数
        return wsize-max_s # 窗口大小-窗口内1的最大数量得到0的最小数量也就是交换次数
posted @ 2022-01-10 23:47  jucw  阅读(176)  评论(0编辑  收藏  举报