当前位置: 首页 > news >正文

LeetCode 滑动窗口 最少交换次数来组合所有的 1 II

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

交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
环形 数组是一个数组,可以认为 第一个 元素和 最后一个 元素 相邻 。
给你一个 二进制环形 数组 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

题解

首先我们统计数组中所有的 1 的个数 sum

我们需要将所有的 1 聚集到一起,也就是说这个子序列的长度就是 1 的个数

我们可以枚举子序列的开头位置 l ,由于 1 的总个数已知,所以子序列的结尾位置 r 就是 (l+sum-1)%numsSize (numsSize是数组长度)

为什么需要取余,因为题目定义数组为环形数组,数组尾部是与头部相连的

l 与 r 就是我们的定长滑动窗口

那么对于这个子序列,要使所有的 1 聚集到一起,我们需要移动的次数就是子序列中的 0 的个数

我们首先计算出初始子序列中的 0 的个数 sum1

然后移动滑动窗口,也就是 l++,r++,注意 r 接着需要取余

只需要记录循环中最小的 sum1 就是我们的答案

代码如下↓

int minSwaps(int* nums, int numsSize) {int sum=0;int res=0;int sum1=0;if(numsSize==1){return 0;}for(int i=0;i<numsSize;i++){if(nums[i]==1){sum++;}}int l=0,r=(l+sum-1)%numsSize;for(int i=0;i<=r;i++){if(nums[i]==0){sum1++;}}int min = sum1;while(l<numsSize-1)//因为循环中我的操作是先移动窗口,再进行记录,所以l移动到倒数第二个即可,防止越界{if(nums[l]==0){sum1--;}l++;r++;if(nums[r%numsSize]==0){sum1++;}if(sum1<min){min=sum1;}}return min;
}

http://www.mrgr.cn/news/31838.html

相关文章:

  • 湖北师范大学-Java入门 - 分支结构
  • 基于单片机汽车驾驶防瞌睡防疲劳报警器自动熄火设计
  • 浅谈Python之协程
  • 以STM32CubeMX创建DSP库工程方法二
  • 与姜妍同款冰箱,容声516WILL养鲜冰箱领“鲜”上市
  • Tomcat 乱码问题彻底解决
  • Go语言笔记
  • 计算机网络:物理层 --- 基本概念、编码与调制
  • mac新手入门(快捷键)
  • 电脑是否有问题?检测软件别再乱下载了,只要用这一款工具箱,就可以满足你的需求!
  • FLUX.1+ComfyUI部署与使用:图像合成技术的新高度
  • 大数据实验一: Linux系统安装和使用
  • JDK1.8的新特性
  • 计算机图形学 中心画圆算法 原理及matlab代码实现
  • 智慧医院人工智能应用场景 | 智能导诊系统源码
  • MySQL深入原理
  • A-C-E-F四题。2024华为杯建模解题思路:独家出版,思路解析+模型代码。
  • Redis面试真题总结(三)
  • AI入门系列 | 如何优雅地下载最前沿的模型?
  • Spring Cloud 与 Dubbo 的区别及选择指南