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;
    }
}
    心之所向,素履以往 生如逆旅,一苇以航

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号