0
点赞
收藏
分享

微信扫一扫

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

微言记 2022-02-01 阅读 46

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;
    }
};

留着自己看。

举报

相关推荐

0 条评论