leetcode 2134. 最少交换次数来组合所有的 1 II
交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。
《滑动窗口》
环的话就把长度变长一倍
class Solution {
public:
int minSwaps(vector<int>& nums) {
// 统计1的个数
int cnt = accumulate(nums.begin(), nums.end(), 0);
// 全部为1或者全部为0,或者只有一个1,返回0
if (cnt == 1 || cnt == 0 || nums.size() == cnt) return 0;
vector<int> v = nums;
// 把数组变长一倍
v.insert(v.end(), nums.begin(), nums.end());
int left = 0, right = 0;
int ret = cnt;
int num = 0;
// 滑动窗口
while (right < v.size())
{
if (v[right] == 0) num ++ ;
// 窗口长度为cnt
if (right - left == cnt)
{
if (v[left] == 0)
{
num -- ;
}
left ++ ;
if (num < ret ) ret = num;
}
right ++ ;
}
return ret;
}
};
留着自己看。