LeetCode 2134. 最少交换次数来组合所有的 1 II(median)

题目

LeetCode 2134. 最少交换次数来组合所有的 1 II(median)

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。

环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻

给你一个 二进制环形 数组 nums ,返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。

示例 1:

输入:nums = [0,1,0,1,1,0,0]
输出:1
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[0,0,1,1,1,0,0] 交换 1 次。
[0,1,1,1,0,0,0] 交换 1 次。
[1,1,0,0,0,0,1] 交换 2 次(利用数组的环形特性)。
无法在交换 0 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 1 。

示例 2:

输入:nums = [0,1,1,1,0,0,1,1,0]
输出:2
解释:这里列出一些能够将所有 1 聚集在一起的方案:
[1,1,1,0,0,0,0,1,1] 交换 2 次(利用数组的环形特性)。
[1,1,1,1,1,0,0,0,0] 交换 2 次。
无法在交换 0 次或 1 次的情况下将数组中的所有 1 聚集在一起。
因此,需要的最少交换次数为 2 。

示例 3:

输入:nums = [1,1,0,0,1]
输出:0
解释:得益于数组的环形特性,所有的 1 已经聚集在一起。
因此,需要的最少交换次数为 0 。

提示:

  • 1 <= nums.length <= 105

  • nums[i]0 或者 1

5977_1

解题思路

  1. 先统计出1的数目len,则最终所有1聚集在一起时,长度为 len
  2. 遍历所有长度为 len 的区间,统计其中1的数目now_sum,其中0的位置都需要被替换为1,则需要的操作次数为len - now_sum
  3. 记录遍历过程中操作次数最小值ret,即为最终答案

Tips:

  • 由于数组是首尾相接的,因此滑动窗口可以横跨首尾,通过(i + len - 1) % m来得到最后一位

  • 区间和即代表1的个数,可以随着滑动窗口的移动更新,即减去nums[i - 1]和加上nums[(i + len - 1) % m]

图示

5977_2

代码(C++实现)

class Solution {
public:
    int minSwaps(vector<int>& nums) {
        int n = nums.size();
        int len = accumulate(nums.begin(), nums.end(), 0);
        if (len == n || !len)   //若全为1或全为0,则不需要操作
            return 0;
        int now_sum = accumulate(nums.begin(), nums.begin() + len, 0);
        int ret = len - now_sum;
        for (int i = 1; i < n; ++i) {
            now_sum -= nums[i - 1];
            now_sum += nums[(i + len - 1) % n];
            ret = min(ret, len - now_sum);
        }
        return ret;
    }
};

有收获的话,求个赞~ Click Here

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-swaps-to-group-all-1s-together-ii

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Air浩瀚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值