【leetcode】NO.2134. 最少交换次数来组合所有的 1 II (Python)[周赛]
题目:2134. 最少交换次数来组合所有的 1 II
解题思路
先统计滑动窗口内1的个数的最大值,利用滑动窗口大小-之后得到的是0的个数的最小值
- 解决环形问题:原数组加倍
- 统计原数组的长度,作为滑动窗口;
- 向右滑动过程中右侧进入如果是1,1的个数+1,如果是0,1个数+0;
- 向右滑动过程中左侧出去如果是1,1的个数-1,如果是0,1的个数-0;
- 更新最大值
- 用窗口大小- 最大值得到交换次数最小值;
代码
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的最小数量也就是交换次数
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/15786529.html