算法通关村第十六关:白银挑战-滑动窗口经典问题

白银挑战-滑动窗口经典问题

1. 最长子串专题

1.1 无重复字符的最长子串

LeetCode3

思路分析

要找最长子串,需要直到无重复字符串的首和尾,然后再确定最长的那个,需要两个指针,可利用滑动窗口思想

方法1:集合

  • 建立一个集合用于存储无重复的字符
  • 建立滑动窗口的起始位置 left,right
  • right向前滑动
    如果遇到相同元素,left向前滑动并删除集合中对应的元素,直到相同元素被删除,然后再将right对应元素保存至集合中
    如果遇到不同元素,left不变,将right对应元素保存至集合中
  • 一边滑动一边比较集合长度和已知最大长度,最大长度取比较的较大值
  • 字符遍历完成,输出最大长度

方法2:map

  • 定义一个 K-V 形式的map,key表示字符串,value表示其下标索引值
  • 定义两个指针left 和 right,left表示无重复字符串首部索引,right为尾部索引
  • 遍历字符串,每访问一个字符,都将更新map,将字符串下标索引值更新成最新的
    如果遇到重复元素,更新对应下标索引,同时更新left,left取原left值和重复元素索引值+1二者最大值(特殊情况 abba, b先重复,a后重复,防止left倒流)
  • 一边滑动一边比较right-left长度和已知最大长度,最大长度取比较的较大值
  • 字符遍历完成,输出最大长度

代码实现

方法1:集合

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0char_set = set()left = 0max_len = 0for right in range(len(s)):while s[right] in char_set:char_set.remove(s[left])left += 1char_set.add(s[right])max_len = max(max_len, len(char_set))return max_len

方法2:map

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if len(s) == 0:return 0char_map = {}max_len = 0left = 0for right in range(len(s)):if s[right] in char_map:left = max(left, char_map[s[right]] + 1)char_map[s[right]] = rightmax_len = max(max_len, right - left + 1)return max_len

1.2 至多包含两个不同字符的最长子串

LeetCode159 至多包含两个不同字符的最长子串
给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。
https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/

思路分析

仍然使用 left 和 right 来锁定一个窗口,然后一边向右移动一边分析

我们接下来需要解决两个问题

  1. 怎么判断只有两个元素
  2. 移除时怎么知道移除谁,以及移除之后的left是什么

怎么判断只有两个元素?
还是hash好用,每一个时刻,hashmap包括不超过3个元素

判断移除谁,移除后left是什么?
设计一下hashmap的key-value的含义,key:字符,value:窗口中最右边的字符位置

del_idx = min(hashmap.values())
del hashmap[s[del_idx]]
left = del_idx + 1

代码实现

class Solution:def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:if len(s) < 3:return len(s)char_map = {}max_len = 0left = 0for right in range(len(s)):if len(char_map) < 3:char_map[s[right]] = rightif len(char_map) == 3:del_idx = min(char_map.values())del char_map[s[del_idx]]left = del_idx + 1max_len = max(max_len, right - left + 1)return max_len

1.3 至多包含K个不同字符的最长子串

LeetCode340
https://leetcode.cn/problems/longest-substring-with-at-most-k-distinct-characters/description/

思路分析
与上一题类似,只要把2改为k即可

代码实现

class Solution:def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int:if len(s) < k+1:return len(s)char_map = {}max_len = 0left = 0for right in range(len(s)):if len(char_map) < k+1:char_map[s[right]] = rightif len(char_map) == k+1:del_idx = min(char_map.values())del char_map[s[del_idx]]left = del_idx + 1max_len = max(max_len, right - left + 1)return max_len

2. 长度最小的子数组

LeetCode209
https://leetcode.cn/problems/minimum-size-subarray-sum/

思路分析

本题可以使用双指针来解决,也可视为队列法

基本思路如下
先让元素不断入队,当入队元素和大于等于target是记录一下此时队列的容量
如果队列元素之和大于等于target则开始出队,直到小于target再入队

代码实现

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:left = 0min_len = len(nums) + 1total = 0for right in range(len(nums)):total += nums[right]while total >= target:min_len = min(min_len, right - left + 1)total -= nums[left]left += 1return min_len if min_len <= len(nums) else 0

3. 盛水最多的容器

LeetCode11
https://leetcode.cn/problems/container-with-most-water/

思路分析

盛水的体积的计算:短板的高度*长短板之间的宽度
S(left, right) = min(h[left], h[right])(right - left)

长短板分列最左边和最右边,宽度最大,此时长板或短板向中间收窄,宽度会变小,此时板的高度

  • 若短板向中间收窄,短板可能变大,水槽面积可能增加
  • 若长板向中间收窄,短板可能变小或不变,水槽面积一定变小

具体执行

  • 初始双指针分列水槽的左右两端
  • 循环每轮将短板向内移动一格
  • 更新面积的最大值,直到两指针相遇时跳出,即可获得最大面积

代码实现

class Solution:def maxArea(self, height: List[int]) -> int:left, right = 0, len(height)-1s = 0while left < right:s = max(s, min(height[left], height[right]) * (right - left))if height[left] < height[right]:left += 1else:right -= 1return s

4. 寻找子串异位词(排列)

异位词(排列)
如果两个字符串仅仅是字母出现的位置不一样,则称两者互为对方的一个排列,也称异位词

如何判断?

  • 字母的类型一样
  • 每个字母出现的个数也是一样的

4.1 字符串的排列

LeetCode 567
https://leetcode.cn/problems/permutation-in-string/

思路分析

  • 字符串的异位词长度 和 字符串的长度是样的,所以以字符串的长度作为滑动窗口的大小
  • 窗口一边右移,一边比较
  • 如何判断异位词,排序的代价太高了,可以创建一个大小为26的数组,每个位置存储从a到z的个数
    数组索引使用 index = s1.charAt(i) - ‘a’ 来表示
  • 窗口右移:charArray[s2.charAt(right) - ‘a’]++
  • 窗口左移:int left = right - s1.length; charArray[s2.charAt(left) - ‘a’]–

代码实现

python中字母与ascii转换 chr() ord()

class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:n1, n2 = len(s1), len(s2)if n1 > n2:return Falsechar_arr1 = [0] * 26char_arr2 = [0] * 26for i in range(n1):char_arr1[ord(s1[i]) - ord('a')] += 1char_arr2[ord(s2[i]) - ord('a')] += 1if char_arr1 == char_arr2:return Trueleft = 0for right in range(n1, n2):char_arr2[ord(s2[right]) - ord('a')] += 1char_arr2[ord(s2[left]) - ord('a')] -= 1left += 1if char_arr1 == char_arr2:return Truereturn False

4.2 找到字符串中所有字母异位

LeetCode438
https://leetcode.cn/problems/find-all-anagrams-in-a-string/

思路分析
思路分析同上题一致,多加了一步进行处理

增加了一个列表,记录出现异位词的位置,如果出现了,将其加到列表中

代码实现

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:n1, n2 = len(p), len(s)if n1 > n2:return []res = []char_arr1 = [0] * 26char_arr2 = [0] * 26for i in range(n1):char_arr1[ord(p[i]) - ord('a')] += 1char_arr2[ord(s[i]) - ord('a')] += 1if char_arr1 == char_arr2:res.append(0)left = 0for right in range(n1, n2):char_arr2[ord(s[right]) - ord('a')] += 1char_arr2[ord(s[left]) - ord('a')] -= 1left += 1if char_arr1 == char_arr2:res.append(left)return res
class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:p_len, s_len = len(p), len(s)if p_len > s_len:return []res = []p_count = [0] * 26s_count = [0] * 26for i in range(p_len):p_count[ord(p[i]) - ord('a')] += 1s_count[ord(s[i]) - ord('a')] += 1if p_count == s_count:res.append(0)for i in range(s_len - p_len):s_count[ord(s[i + p_len]) - ord('a')] += 1s_count[ord(s[i]) - ord('a')] -= 1if p_count == s_count:res.append(i + 1)return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

layui--记录

layui 行点击事件&#xff1a;点了没反应&#xff1f; //监听行工具事件layui.table.on(tool(demo), function (obj) {//alert(222) });原因&#xff1a;检查下id与lay-filter是否一致&#xff1b;id与lay-filter必须一致。 <table id"demo" lay-filter"dem…

Yarn资源调度器

文章目录 一、Yarn资源调度器1、架构2、Yarn工作机制3、HDFS、YARN、MR关系4、作业提交之HDFS&MapReduce 二、Yarn调度器和调度算法1、先进先出调度器&#xff08;FIFO&#xff09;2、容量调度器&#xff08;Capacity Scheduler&#xff09;3、公平调度器&#xff08;Fair …

业务调整,业绩短期承压,市场热潮退去后的乐舱物流将驶向何方?

撰稿|行星 来源|贝多财经 9月5日&#xff0c;乐舱物流股份有限公司&#xff08;下称“乐舱物流”&#xff09;通过港交所上市聆讯&#xff0c;并披露了通过港交所聆讯后的资料集&#xff08;即招股书&#xff09;&#xff0c;中信证券和农银国际为其联席保荐人。 成立于2004…

pdf怎么转换成dwg格式?简单转换方法分享

当我们需要在CAD中编辑PDF文件中的向量图形时&#xff0c;将PDF转换成DWG格式是一个非常好的选择。因为PDF是一种非常流行的文档格式&#xff0c;很多时候我们会接收到PDF文件&#xff0c;但是PDF文件中的向量图形无法直接在CAD中编辑。而将PDF转换成DWG格式后&#xff0c;就可…

【网络层】网络基础 -- IP协议

引入IP协议头格式网段划分特殊的IP地址IP地址的数量限制 私有IP地址和公网IP地址分片与组装如何分片与组装&#xff1f; 引入 我们前面学习了传输层的相关知识&#xff0c;难道真的就是直接传送吗&#xff1f;当然不是&#xff0c;那TCP究竟做了什么&#xff1f;IP又扮演什么角…

图床项目详解

文章目录 一、图床项目介绍二、图床项目架构三、图床功能实现3.1 注册功能3.2 登录功能3.3 用户文件列表3.4 上传文件3.5 上传文件之秒传3.6 获取共享文件列表或下载榜3.7 分享/ 删除文件/ 更新下载数3.8 取消分享/ 转存/ 更新下载计数3.9 图床分享图片 一、图床项目介绍 实现…

想考PMP,符合报名条件么?怎么报考?

报考PMP第一步就是了解报名条件&#xff1a; PMP考试如何报名&#xff1f; 先在PMI官网报英文报名&#xff0c;再在人才交流基金会上报中文报名以及缴费。 1、英文报名 PMP英文报名就是在PMI网站上提交对应的英文材料信息。不限时间&#xff0c;随时可以报名&#xff0c;报…

2023年高教社杯 国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数…

qt : day 3

1.完成登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 ------------------------------------------------------------------ .pro ------------------------------------------------------------------ QT core gui texttospeech greaterThan(QT_MAJOR_V…

Talk | ICCV‘23南洋理工大学博士后李祥泰:面向统一高效的视频分割方法设计

本期为TechBeat人工智能社区第528期线上Talk&#xff01; 北京时间9月6日(周三)20:00&#xff0c;南洋理工大学博士后研究员—李祥泰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “面向统一高效的视频分割方法设计”&#xff0c;他分享了其在视…

华为云云服务器评测|安装Java8环境 配置环境变量 spring项目部署 【!】存在问题未解决

目录 引出安装JDK8环境查看是否有默认jar上传Linux版本的jar包解压压缩包配置环境变量 上传jar包以及运行问题上传Jar包运行控制台开放端口访问失败—见问题记录关闭Jar的方式1.进程kill -92.ctrl c退出 问题记录&#xff1a;【!】未解决各种方式查看端口情况联系工程师最后排查…

在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

智能电销机器人,主要体现的价值是什么

21世纪科技的迅速发展&#xff0c;人工智能逐渐走入大家的视线&#xff0c;越来越多的机器人出现在我们生活中。见的最多的有电销公司的智能语音机器人、在仓库拣货打包的机器人、商场店铺供娱乐对话的机器人。机器人活跃在各行各业中&#xff0c;降低了人工成本&#xff0c;代…

录音工具哪个好用?亲身测评,推荐这几个

“电脑录音用什么工具呀&#xff0c;前几天录制的视频声音没有录进去&#xff0c;现在需要重新补录声音&#xff0c;但是找不到合适的录音工具&#xff0c;就想问问大家&#xff0c;有没有好用的录音工具推荐呀&#xff1f;” 现如今&#xff0c;录音工具在我们的生活和工作中…

Kubernetes(k8s)上安装Prometheus和Grafana监控

Kubernetes上安装Prometheus和Grafana监控 环境准备Kubernetes准备 安装项目开始安装下载安装的项目安装项目替换镜像替换kube-state-metrics替换prometheus-adapter 修改Service修改alertmanager-service.yaml修改grafana-service.yaml修改prometheus-service.yaml 执行这些ya…

报错:crbug/1173575 non-js module files deprecated

环境&#xff1a; vue3 &#xff0c; visual studio code, bulma 背景&#xff1a; 在代码中&#xff0c;使用标签来进行导航栏跳转。 如&#xff1a; <div class"navbar-start"><a href"/groups">产品</router-link> </div>执…

Vue + Element UI 前端篇(三):工具模块封装

Vue Element UI 实现权限管理系统 前端篇&#xff08;三&#xff09;&#xff1a;工具模块封装 封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情&#xff0c;但是axios没有进行封装复用&#xff0c;项目越来越大&#xff0c;会引起越来越多的代码冗余&am…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

远程访问服务器JupyterLab的配置方法【转载】

远程访问服务器JupyterLab的配置方法 环境及工具基本步骤生成密码生成并修改配置文件后台运行jupyter后台关闭 其实就是在服务器运行JupyterLab&#xff0c;然后在本地浏览器访问 环境及工具 服务器&#xff1a;Ubuntu 16.04 本机&#xff1a;Mac OS Catalina 10.15.3 Royal …