[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解

本文主要是介绍[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.无重复字符的最长字串
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.最大连续的一个数 Ⅲ
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.将x减到0的最小操作数
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.无重复字符的最长字串

1.题目链接

  • 无重复字符的最长字串

2.算法原理详解

  • 研究的对象依旧是⼀段连续的区间,因此继续使⽤「滑动窗⼝」思想来优化
    • 滑动窗口 + 哈希表(判断字符是否重复出现)
  • 让滑动窗⼝满⾜:窗⼝内所有元素都是不重复的
  • 做法:右端元素s[right]进⼊窗⼝的时候,哈希表统计这个字符的频次
    • 如果这个字符出现的频次超过1 ,说明窗⼝内有重复元素
      • 那么就从左侧开始划出窗⼝, 直到s[right]这个元素的频次变为1,然后再更新结果
    • 如果没有超过1,说明当前窗⼝没有重复元素,可以直接更新结果
      请添加图片描述

3.代码实现

int LengthOfLongestSubstring(string s) 
{int n = s.size(); int ret = 0;int hash[128] = { 0 }; // 利用hash查重for(int left = 0, right = 0; right < n; right++){hash[s[right]]++; // 入窗口while(hash[s[right]] > 1){hash[s[left++]]--; // 出窗口}ret = max(ret, right - left + 1); // 更新结果}return ret;
}

2.最大连续的一个数 Ⅲ

1.题目链接

  • 最大连续的一个数 Ⅲ

2.算法原理详解

  • 不要去想怎么翻转,不要把问题想的很复杂
    • 这道题的结果⽆⾮就是⼀段连续的1中间塞了k个0
  • 问题转化为:子数组内,0的个数不超过k
    • 既然是连续区间,可以考虑使⽤**「滑动窗⼝」**来解决问题
  • 做法:当right < nums.size()时,⼀直下列循环:
    • 让当前元素进⼊窗⼝
      • 1 -> 无视
      • 0 -> zero++
    • 检查0的个数是否超标
      • 如果超标,依次让左侧元素滑出窗⼝
      • 顺便更新zero的值,直到0的个数恢复正常
    • 程序到这⾥,说明窗⼝内元素是符合要求的,更新结果
    • right++,处理下⼀个元素
      请添加图片描述

3.代码实现

int LongestOnes(vector<int>& nums, int k) 
{// 问题转化为,子数组内,0的个数不超过kint ret = 0;for(int left = 0, right = 0, zero = 0; right < nums.size(); right++){if(nums[right] == 0){zero++; // 入窗口}while(zero > k){if(nums[left++] == 0){zero--;}}ret = max(ret, right - left + 1);}return ret;
}

3.将x减到0的最小操作数

1.题目链接

  • 将x减到0的最小操作数

2.算法原理详解

  • 要求是数组「左端+右端」两段连续的、和为x的最短数组
    • 可以转化成求数组内⼀段连续的、和为sum(nums) - x的最⻓数组
      • 即:将两端转化为中间连续
    • 此时,就是熟悉的**「滑动窗⼝」**问题了
  • 做法
    • 转化问题:求target = sum(nums) - x
      • 如果target < 0,问题⽆解
    • 初始化左右指针left = 0, right = 0(滑动窗⼝区间表⽰为 [ l , r ) [l, r) [l,r)
      • 左右区间是否开闭很重要,必须设定与代码⼀致
      • 记录当前滑动窗⼝内数组和的变量sum = 0
      • 记录当前满⾜条件数组的最⼤区间⻓度len = -1
    • right < nums.size()时,⼀直循环:
      • if sum < target
        • right++,直⾄sum >= target ,或right已经移到头
      • if sum > target
        • left++,直⾄sum <= target ,或left已经移到头
      • 如果经过前两步的左右移动使得sum == target
        • 维护满⾜条件数组的最⼤⻓度,并让下个元素进⼊窗⼝
          请添加图片描述

3.代码实现

int MinOperations(vector<int>& nums, int x) 
{// 将模型转化为最长子数组的和 == (sumNum - x)int sum = 0, ret = -1;int target = -x;for(auto& e : nums){target += e;}// 细节处理,当target为负数时,怎么减都减不够if(target < 0){return -1;}for(int left = 0, right = 0; right < nums.size(); right++){sum += nums[right]; // 入窗口while(sum > target) // 判断{sum -= nums[left++]; // 出窗口}if(sum == target){ret = max(ret, right - left + 1); // 更新结果}}return ret == -1 ? -1 : nums.size() - ret;
}

这篇关于[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920066

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —