题目:
交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 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
}