[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

相关文章

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关