算法通关村——滑动窗口高频问题

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

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

1.1 滑动窗口

找到最长字串需要找到字串的首尾位置,而这个首尾位置就是滑动窗口的大小。题目中出现了重复,一般是想到使用hashmap作为存储元素,而这个里面可以将字符串的相应的字符作为k,然后它的下标作为value,一旦遇到有重复字符的,就将左窗口移到当前的位置的右边一位,作为新的字符串的开始位置。

在这里插入图片描述

    public int lengthOfLongestSubstring(String s) {if(s.length() == 0) return 0;// 左窗口开始int left = 0;int max = 0;// 存放k:字符,v:字符下标HashMap<Character,Integer> hashMap = new HashMap<>();for(int right = 0;right<s.length();right++){// 里面包含当前字符,需要移动左窗口的位置if(hashMap.containsKey(s.charAt(right))){left = Math.max(left,hashMap.get(s.charAt(right))+1);}// 不包含,就将元素和它的下标添加hashMap.put(s.charAt(right),right);// 比较大小max = Math.max(max,right-left+1);}return max;}

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

给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度,这就是LeetCode159题。例如:
输入: “eceba”
输出: 3
解释: t 是 “ece”,长度为3。

2.1 滑动窗口

字符串依然是需要首尾位置,采用滑动窗口,和第一题类似,不过这一题的关键在于字符串是两个不同的字符,判断字符是否重复可以使用hashmap,而问题在于如何判断只有两个字符,出现第三个字符应该如何去除之前的字符。
可以使用 int del_idx = Collections.min(hashmap.values());
hashmap.remove(s.charAt(del_idx));
在这里插入图片描述

public int lengthOfLongestSubstringTwoDistinct(String s) {if (s.length() <= 2) {return s.length();}// 最大长度int maxLength = 2;int left = 0;int right = 0;HashMap<Character, Integer> map = new HashMap<>();while (right < s.length()) {// map长度小于3,意味着还没出现第三个不一样的字符,此时可以继续添加,更改对于元素下标if(map.size() < 3) {map.put(s.charAt(right), right++);}// map长度等于3,此时出现了第三个不一样的字符,需要删除一个最小位置下标的字符,然后移动左指针到当前删除下标的下一个位置if(map.size() == 3){int del_idx = Collections.min(map.values());map.remove(s.charAt(del_idx));left = del_idx + 1;}maxLength = Math.max(maxLength, right - left);}return maxLength;}

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

LeetCode340题。
题目的完整要求是:给定一个字符串 s,找出 至多 包含 k 个不同字符的最长子串T。示例:
输入: s = “eceba”, k = 2
输出: 3
解释: 则 T 为 “ece”,所以长度为 3。

3.1 滑动窗口

这一题和上面一样,只不过是将2替换成了k,判断的是否改成k就可以。

    public int lengthOfLongestSubstringKDistinct(String s, int k) {if (s.length() < k) return 0;int left = 0;int right = 0;HashMap<Character, Integer> map = new HashMap<>();int maxLength = k;while (right < s.length()) {if (map.size() < k+1) {map.put(s.charAt(right), right++);}if(map.size() == k+1){int del_idx = Collections.min(map.values());map.remove(s.charAt(del_idx));left = del_idx + 1;}maxLength = Math.max(maxLength, right - left);}return maxLength;}

4. 长度最小的子数组

长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

4.1 滑动窗口

这一题主要思路就是计算滑动窗口区间内的元素和,如果元素和小于目标值,可以继续添加,如果元素和大于目标值,那么就需要将左窗口位置的元素从元素和里面去除,然后移动指针,直到元素和小于目标值。

  public int minSubArrayLen(int target, int[] nums) {int left =0;int right =0;int minLength = Integer.MAX_VALUE;int sum = 0;while(right<nums.length){sum += nums[right++];while(sum >= target){minLength = Math.min(minLength,right-left);sum = sum -  nums[left++];}}return minLength == Integer.MAX_VALUE ? 0 : minLength;}

5. 盛最多水的容器

盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

输入:[1,8,6,2,5,4,8,3,7]
输出:49

5.1 滑动窗口

这一题思路还是很清晰的,首先定义两个指针分别指向首尾,然后向中间移动,移动过程中需要判断左右两个高度,选出最短的,然后计算面积。

 public int maxArea(int[] height) {int left = 0;int right = height.length - 1;int maxAre = 0;while(left < right){maxAre = height[left] < height[right] ? Math.max(maxAre,(right-left) * height[left++] ):Math.max(maxAre,(right-left) * height[right--]);}return maxAre;}

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

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

相关文章

c++保留n位小数输出(百分数形式,保留n位有效数字,设置宽度)

在C中&#xff0c;你可以使用 头文件中的一些函数和控制符来控制输出的小数位数、百分数形式以及设置宽度。下面我将详细讲解如何实现这些功能。 控制小数位数 若要在输出中控制小数位数&#xff0c;你可以使用 std::setprecision 函数。这个函数接受一个整数参数&#xff0c…

多组背包恰好装满方案数

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 现在有一个大小n*1的收纳盒&#xff0c;我们手里有无数个大小为1*1和2*1的小方块&#xff0c;我们需要用这些方块填满收纳盒&#xff0c;请问我们有多少种不同的方法填满这个收纳盒 分析&…

关于 Unity 连接 MuMu 模拟器上的 Unity Remote 5 的方法

在使用 Unity 开发 Android 的过程中&#xff0c;可以通过使用 Unity Remote 这个 app 来和真机连接&#xff0c;进而在真实环境下进行测试性能等工作&#xff0c;而本次则是由于其他问题引出的一个小坑&#xff0c;记录以备后续查询。 这次是由于在自学过程中遇到的一个工程&…

MyBatisPlus枚举类最佳实践(非常典型和高效的枚举类写法)

目录 1、MyBatisPlus枚举类最佳实践 2、枚举类的作用及问题 3、MyBatisPlus注解实现枚举最佳实践 4、简单来说 5、下面我们看一个使用上述注解的完整枚举类示例: &#xff08;1&#xff09;枚举类&#xff1a; &#xff08;2&#xff09;DTO类&#xff1a; 6、根据上面…

Python - 队列【queue】task_done()和join()基本使用

一. 前言 task_done()是Python中queue模块提供的方法&#xff0c;用于通知队列管理器&#xff0c;已经处理完了队列中的一个项目。 queue.task_done()是Queue对象的一个方法&#xff0c;它用于通知Queue对象&#xff0c;队列中的某一项已经被处理完毕。通常在使用Queue对象时…

异步编程 - 13 高性能线程间消息传递库 Disruptor

文章目录 Disruptor概述Disruptor中的核心术语Disruptor 流程图 Disruptor的特性详解基于Disruptor实现异步编程 Disruptor概述 Disruptor是一个高性能的线程间消息传递库&#xff0c;它源于LMAX对并发性、性能和非阻塞算法的研究&#xff0c;如今构成了其Exchange基础架构的核…

探究IP路由的工作原理与路由表查找规则

文章目录 一、定义二、IP连通的前提三、路由表1. 作用2. 路由表字段内容3. 路由表查表规则4. 路由信息的来源5. 路由表写表规则6. 路由优先级 四、常用命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、定义 路由器是网络中负责将数据报文在不同IP网段…

git在linux情况下设置git 命令高亮

只需要执行下面这个命令&#xff0c;这样就可以在查看git status明亮的时候高亮显示。 git config --global color.status auto未设置前 谁知之后

linux中常见服务端安装

linux安装服务脚本 1、yum安装 # 通过apt安装yum apt install yum # yum安装软件 yum install pam-devel # yum 卸载 yum remove pam-devel2、rpm安装 # 安装 rpm -i example.rpm #安装 example.rpm 包&#xff1b; rpm -iv example.rpm #安装 example.rpm 包并在安装过程…

【Unity3D赛车游戏优化篇】【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Redis功能实战篇之附近商户

在互联网的app当中&#xff0c;特别是像美团&#xff0c;饿了么等app。经常会看到附件美食或者商家&#xff0c; 当我们点击美食之后&#xff0c;会出现一系列的商家&#xff0c;商家中可以按照多种排序方式&#xff0c;我们此时关注的是距离&#xff0c;这个地方就需要使用到我…

高等数学笔记

|sinx|连续不可导 只要在x0处存在极限且极限等于f(x0)则函数在此处连续 如果某点可导则左右导数应该相等&#xff08;可导一定连续&#xff0c;连续不一定可导&#xff09; 双曲函数的由来 塞入dx 莱布尼茨公式 sin(nx)的k次导n^k*sin(nxkΠ/2) 注意符号&#xff01; 二阶导公…

Golang源码分析

Golang源码分析 Golang源码分析-builtin.goGolang源码分析-bytes.goGolang源码分析-bytes/buffer.goGolang源码分析-bytes/reader.goGolang源码分析-strings.goGolang源码分析-strings builder.goGolang源码分析-strconv包Golang源码分析-io.goGolang源码分析-io/pipe.goGolan…

树的基本概念和存储结构

一、树的基本概念 1、树的定义 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1、有且仅有一个特定的称为根的结点。 2、当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09…

中移粤港澳大湾区创新研究院、南湖研究院类脑实验室面试(部分)

中移粤港澳大湾区创新研究院 reids热key的高并发量&#xff0c;导致此redis节点的cpu使用率爆满&#xff0c;有什么优化方案&#xff1f;高并发情况下为了保证平台正常运行&#xff0c;怎么设置平台的监控和告警 南湖研究院类脑实验室 笔试通过后&#xff0c;面试无后续

Zookeeper简述

数新网络-让每个人享受数据的价值 官网现已全新升级—欢迎访问&#xff01; 前 言 ZooKeeper是一个开源的、高可用的、分布式的协调服务&#xff0c;由Apache软件基金会维护。它旨在帮助管理和协调分布式系统和应用程序&#xff0c;提供了一个可靠的平台&#xff0c;用于处理…

Qt配置使用MSVC编译器

Qt配置使用MSVC编译器_qt msvc-CSDN博客注意:Qt支持的MSVC就是2017和2015&#xff0c;所以vs也要下载2017&#xff0c;不要直接用最新的&#xff0c;安装路径都用默认的。程序运行失败时可以尝试windeployqt拷贝库文件到本地&#xff0c;然后有可能就能运行了。VS官网下载Visua…

一个帮各位填秋招表格省一点事的浏览器插件

最近应该很多和我一样的双非鼠鼠在秋招等面试&#xff0c;而且处于海投阶段&#xff0c;为了不忘记投了哪些公司&#xff0c;可以用这样一个表格来记录&#xff1a; 其中有些字段&#xff0c;比如状态、投递时间、查看进度的网址其实可以不手动输入&#xff0c;所以搞个插件来…

CESM2代码下载

这半年忙着毕业写论文&#xff0c;好久好久好久不更新了∠( ω)&#xff0f; &#xff0c;今天准备开个新坑 ๑乛◡乛๑&#xff0c;学习一下CESM&#xff08;Community Earth System Model&#xff09;&#xff0c;它是一个完全耦合的全球气候模型&#xff0c;可用于地球过去、…

智能机器人:打造自动化未来的关键技术

文章目录 1. 智能机器人的基本概念2. 智能机器人的关键技术2.1 机器视觉2.2 机器学习与深度学习2.3 传感器技术 3. 智能机器人的应用领域3.1 制造业3.2 医疗保健3.3 农业3.4 服务业 4. 智能机器人的未来趋势4.1 自主决策能力的提升4.2 协作与互操作性4.3 个性化定制4.4 环境感知…