【算法思考记录】力扣2134. 最少交换次数来组合所有的 1 II【C++,滑动窗口】

news/2024/6/25 22:21:28 标签: 算法, leetcode, c++

最少交换次数来组合所有的 1 II - 解题思路与代码分析

题目描述

本题目要求我们找到在一个环形二进制数组中,通过最少的交换次数把所有的 1 聚集在一起的方法。数组的环形特性意味着第一个元素和最后一个元素是相邻的。我们需要考虑数组的这种特殊结构来找到最优解。

示例分析

  • 示例 1nums = [0,1,0,1,1,0,0]。最少需要交换 1 次。
  • 示例 2nums = [0,1,1,1,0,0,1,1,0]。最少需要交换 2 次。
  • 示例 3nums = [1,1,0,0,1]。由于环形特性,所有 1 已经聚集在一起,因此不需要交换。

解题思路

解决这个问题的核心思想是使用滑动窗口技术。首先统计数组中 1 的数量,这将决定我们滑动窗口的大小。然后我们遍历整个数组两次(考虑到环形结构),统计窗口内 0 的数量,这个数量就是需要交换的次数。我们寻找最小的这个交换次数作为答案。

答案代码分析

class Solution {
public:
    int minSwaps(vector<int>& nums) {
        int n = nums.size();
        int win_size = count(nums.begin(), nums.end(), 1);
        if (win_size == 0) {
            return 0;
        }

        int round_cnt = 0;
        int first_win_ridx = win_size - 1;
        int ans = 1e5; // 初始化一个大数作为初始答案
        int left = 0, right = 0;
        int win_zero_num = 0;
        int win_ele_num = 1;

        while (round_cnt < 2) {
            if (nums[right] == 0) {
                win_zero_num++;
            }

            if (win_ele_num == win_size) {
                ans = min(ans, win_zero_num);
                if (nums[left] == 0) {
                    win_zero_num--;
                }
                left++;
                left %= n; // 考虑环形数组特性
                win_ele_num--;
            }

            right++;
            right %= n; // 考虑环形数组特性
            if (right == first_win_ridx) {
                round_cnt++;
            }

            win_ele_num++;
        }
        return ans;
    }
};
  • 初始化窗口大小为数组中 1 的数量。
  • 通过双指针技术移动窗口,统计窗口中 0 的数量。
  • 使用 round_cnt 确保遍历整个数组两次,因为数组是环形的。
  • 当窗口移动时,更新所需的最少交换次数。

http://www.niftyadmin.cn/n/5236041.html

相关文章

296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

1、根因分析 -根因分析:当有新版本并且grade等级是2的时候,点击ptz的时候使用的是RSDialog,WA_DeleteOnClose属性默认是为true的, 并且是栈上的变量,当关闭ptz的时候,diolog的exec结束会向系统发送延后销毁事件,此时退出ptz会弹出自动升级对话框,接管了 事件循环,则会调用前面…

深度学习中的Transformer机制

Transformer 是一种深度学习模型结构&#xff0c;最初由Vaswani等人于2017年提出&#xff0c;用于自然语言处理任务&#xff0c;尤其是机器翻译。Transformer 引入了自注意力机制&#xff08;self-attention mechanism&#xff09;&#xff0c;这是其在处理序列数据时的关键创新…

Kubernetes学习笔记-Part.01 Kubernets与docker

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第一章 Kubernets与docker Docker是一种轻量级的容器…

npmmirror 镜像站(国内好用的npm镜像站 cnpm)

npmmirror 镜像站 原淘宝npm域名即将停止解析&#xff0c;请切换至新域名 npmmirror.com http://npm.taobao.org和 http://registry.npm.taobao.org 已经在 2022.06.30 号正式下线和停止 DNS 解析。 新域名为 npmmirror.com, 相关服务域名切换规则请参考&#xff1a; http:/…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建OA系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

【Unity动画】什么是动画蒙版(Avatar Mask)

Avatar Mask&#xff08;骨骼蒙版&#xff09;是Unity中用于限制动画系统作用范围的一种机制。它允许你选择性地启用或禁用动画系统对模型骨骼的影响&#xff0c;从而实现更精细的动画控制。 以下是Avatar Mask的一些关键概念&#xff1a; 骨骼蒙版&#xff08;Bone Mask&…

Hadoop——分布式存储HDFS

HDFS集群环境部署 VMware虚拟机中部署 一、https://hadoop.apache.org中下载安装包 二、环境分配 三、上传、解压 确认服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等 四、修改配置文件 hdfs-site.xml ①、dfs.datanode.data.dir.perm 700 h…

vxlan分布式网关部署案例

配置逻辑思维步骤: 1、配置同子网互访 2、配置不同子网互访(集中式或分布式) 3、所有的vtep配置相同的vbif接口,相同mac,相同IP,开户分布式网关功能,开启主机信息收集能力 4、在所有的EVPN邻居间开户IRB路由传递能力 5、创建三层VPN实例,配置RD,eirt,。 不同的的租户…