2134. 最少交换次数来组合所有的 1 II
交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-swaps-to-group-all-1s-together-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int minSwaps(int[] nums) {
int ones = 0;
for (int i = 0; i < nums.length; ++i) {
if (nums[i] == 1) {
ones++;
}
}
if (ones <= 1) {
return 0;
}
int ans = Integer.MAX_VALUE;
boolean first = true;
int zeros = 0;
int right = 0, left = 0;
while (first || left != 0) {
zeros += nums[right] ^ 1;
int length = (right - left + nums.length) % nums.length + 1;
if (length == ones) {
ans = Math.min(ans, zeros);
zeros -= nums[left] ^ 1;
left = (left + 1) % nums.length;
first = false;
}
right = (right + 1) % nums.length;
}
return ans;
}
}