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

99 阅读1分钟

题目:
交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

算法:
方法:??? 假设1的个数是m,交换后得到的是长度位m的连续为1的子数组。我们去一个滑动窗口固定长度m,计算窗口内的0的个数,就是要交换的次数。
环形数组可以在数组之后在拼接一个同样的数组,断环成链,或者对下标求余计算新的下标

func minSwaps(nums []int) int {
    count := 0
    for i := range nums {
        if nums[i] == 1 {
            count ++
        }
    } 
    ans := math.MaxInt64
    zeroCount := 0
    i := 0
    for ; i < count; i ++ {
        if nums[i] == 0 {
            zeroCount ++
        }
    }
    
    n := len(nums)
    for  left, right := 0, count - 1; left < n; left, right = left + 1, (right + 1) % n {
        if zeroCount < ans {
            ans = zeroCount
        }
        if nums[(right + 1) % n] == 0 {
            zeroCount ++
        }
        if nums[left] == 0 {
            zeroCount --
        }
    }
    return ans
}