LeetCode HOT100(三)滑动窗口

子数组最大平均数 I

(非hot100,但是滑动窗口的思想可以很好的体现,入门滑动窗口很好的题)
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75


解法1:滑动窗口

  1. 维持一个滑动窗口,窗口大小保持k不变,
  2. 初始化将滑动窗口压满,取得第一个滑动窗口的目标值
  3. 继续滑动窗口,每往前滑动一次,需要删除一个和添加一个元素
public double findMaxAverage(int[] nums, int k) {double sum = 0.0;for(int i=0; i<k; i++){sum += nums[i];}double res = sum;for(int i=k; i<nums.length; i++){sum = sum+nums[i]-nums[i-k];res = Math.max(res,sum);}return res/k;
}

无重复字符的最长字串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。


解法1:滑动窗口
定义两个指针 start 和 end,表示当前处理到的子串是 [start,end]。
[start,end] 始终满足要求:无重复字符。
从前往后进行扫描,同时维护一个哈希表记录 [start,end] 中每个字符出现的次数。
遍历过程中,end 不断自增,将第 end 个字符在哈希表中出现的次数加一。
令 right 为 下标 end 对应的字符,当满足 map.get(right) > 1 时,代表此前出现过第 end 位对应的字符。
此时更新 start 的位置(使其右移),直到不满足 map.get(right) > 1 (代表 [start,end] 恢复满足无重复字符的条件)。同时使用 [start,end] 长度更新答案。

public int lengthOfLongestSubstring(String s) {if(s == null || s.length()==0) return 0;int[] bit = new int[100];int left = 0;int res = 0;for(int i=0; i<s.length(); i++){char c = s.charAt(i);//可以用=,因为bit内维护的是符合要求的子串//符合要求的子串每个元素只能有一个,不存在大于1的情况while(bit[c-' ']==1){bit[s.charAt(left++)-' ']--;}bit[c-' ']=1;res = Math.max(res,i-left+1);}return res;
}
func lengthOfLongestSubstring(s string) int {res := 0;charArr := [128]int{}l,r := 0,0lenght := len(s)for r<lenght {for charArr[s[r]] != 0{charArr[s[l]]--l++;}charArr[s[r]]++if res<(r-l+1) {res = (r-l+1)}r++}return res
}

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

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。


解法1:滑动窗口
首先创建一个数组,这个数组用来统计两个字符串(目标字符串p和当前字串s’)之间的差异的
首先将目标字符串p的每个字符统计加入到数组中,对于每个字符,计算出char-'a’之间的差值作为索引,将对应索引的值-1.
当统计完目标字符串的数组之后,当前数组有若干个索引上的元素为负数,表示有多少个相应字符出现在了目标字符串中。
接下来遍历字符串s,当当前字串长度和目标字符串长度相同是,判断数组是否每个元素都为0,为零则说明是异位词,否则不是。
判断完之后,左侧索引-1,相应的索引位置的值-1,右侧索引+1,相应的索引位置的值+1

public List<Integer> findAnagrams(String s, String p) {List<Integer> res = new ArrayList<>();int len = p.length();if(len>s.length()) return res;int[] charArr = new int[26];//首先将目标字符串的所有字符位置变为负数,有多少个就变成负多少//后边滑动窗口内维持的字串如果能让数组变为全0则符合要求for(int i=0; i<len; i++){char c = p.charAt(i);charArr[c-'a']--;char d = s.charAt(i);charArr[d-'a']++;}if(check(charArr)) res.add(0);for(int i=len; i<s.length(); i++){charArr[s.charAt(i-len)-'a']--;charArr[s.charAt(i)-'a']++;if(check(charArr)) res.add(i-len+1);}return res;
}public boolean check(int[] arr){for(int i=0; i<26; i++){if(arr[i]!=0) return false;}return true;
}

解法2:解法1的优化
解法1中每次对滑动窗口的检查都不可避免需要检查每个词频数组,复杂度为 O©。
事实上,我们只关心两个数组是否完全一致,因而我们能够只维护一个词频数组 cnt 来实现。
起始处理 p 串时,只对 cnt 进行词频字符自增操作。当处理 s 的滑动窗口子串时,尝试对 cnt 中的词频进行「抵消/恢复」操作:
当滑动窗口的右端点右移时(增加字符),对 cnt 执行右端点字符的「抵消」操作;
当滑动窗口的左端点右移时(减少字符),对 cnt 执行左端点字符的「恢复」操作。
同时,使用变量 a 统计 p 中不同字符的数量,使用变量 b 统计滑动窗口(子串)内有多少个字符词频与 p 相等。
当滑动窗口移动( 执行「抵消/恢复」)时,如果「抵消」后该字符词频为 0,说明本次右端点右移,多产生了一位词频相同的字符;如果「恢复」后该字符词频数量为 1,说明少了一个为词频相同的字符。当且仅当 a=b 时,我们找到了一个新的异位组。

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<>();int n = s.length(), m = p.length();int[] cnt = new int[26];for (int i = 0; i < m; i++) cnt[p.charAt(i) - 'a']++;int a = 0;for (int i = 0; i < 26; i++) if (cnt[i] != 0) a++;for (int l = 0, r = 0, b = 0; r < n; r++) {// 往窗口增加字符,进行词频的抵消操作,如果抵消后词频为 0,说明有一个新的字符词频与 p 完全相等if (--cnt[s.charAt(r) - 'a'] == 0) b++; // 若窗口长度超过规定,将窗口左端点右移,执行词频恢复操作,如果恢复后词频为 1(恢复前为 0),说明少了一个词频与 p 完全性相等的字符if (r - l + 1 > m && ++cnt[s.charAt(l++) - 'a'] == 1) b--;if (b == a) ans.add(l);}return ans;}
}

替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。
在执行上述操作后,返回 包含相同字母的最长子字符串的长度。

输入:s = “ABAB”, k = 2
输出:4
解释:用两个’A’替换为两个’B’,反之亦然。


解法1:滑动窗口
令 l 为符合条件的子串的左端点,r 为符合条件的子串的右端点。
使用 count 统计 [l,r] 范围的子串中每个字符串出现的次数。
对于合法的子串而言,必然有 sum(所有字符的出现次数) - max(出现次数最多的字符的出现次数)= other(其他字符的出现次数) <= k。
当找到这样的性质之后,我们可以对 s 进行遍历,每次让 r 右移并计数,如果符合条件,更新最大值;如果不符合条件,让 l 右移,更新计数,直到符合条件。

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

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

相关文章

LabVIEW阀门运动PCT测试

开发了一套基于LabVIEW的阀门运动PCT&#xff08;Pressure-Composition-Temperature&#xff09;测试方法。该系统通过控制阀门运动&#xff0c;实现对氢气吸附和解吸过程的精确测量和控制。所用硬件包括NI cDAQ-9174数据采集模块、Omega PX309压力传感器、SMC ITV2030电动调节…

文学式开发工具 Jupyter Notebook

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。为什么说Jupyter Notebook是文学式开发工具&#xff1f;因为Jupyter Notebook将代码、说明文本、数学方程式、数据可视化图表内容全部组合到一起并显示在一个共享的文档中&#xff0c;可以实现一边写代码一边记录的效果&am…

hot100 | 九、图论

1-leetcode200. 岛屿数量 注意&#xff1a; 蛮巧妙的做法&#xff0c;直接在读取到1的时候给res的值1,然后深度优先搜索把所有相邻的陆地全部改为海洋注意dfs里面的范围判断&#xff0c;[0, **length-1]**length-1length-1length-1 public int numIslands(char[][] grid) {in…

一文搞定node.js和Vue脚手架的介绍以及安装

node.js的介绍以及安装 node.js的介绍 node.js提供了前端程序的运行环境&#xff0c;可以把node.js理解成是运行前端程序的服务器。node.js的安装 从官网下载安装即可&#xff1a;http://nodejs.cn/download/不要勾选这个,否则会下载很多东西 node -v 是 查看node的版本 npm…

按下快门前的算法——对焦

对焦算法可以分为测距式&#xff0c;相位式&#xff0c;反差式。 其中测距式是通过激光&#xff0c;&#xff08;TOF&#xff0c;Time of Flight&#xff09;等主动式地得知物距&#xff0c;然后对焦。更常用的是后两者。 反差式CDAF&#xff08;Contrast Detection Auto Foc…

【服务器】端口映射

文章目录 1.端口映射的概念1.1 端口映射的类型1.2 端口映射的应用场景1.3 示例 2.为什么要进行端口映射呢&#xff1f;3.原理3.1【大白话】原理解释3.2 原理图 4.代码 1.端口映射的概念 端口映射&#xff08;Port Mapping&#xff09;&#xff0c;也称为端口转发&#xff08;P…

docker基础知识以及windows上的docker desktop 安装

记录以供备忘 基础概念&#xff1a; 什么是docker 将程序和环境一起打包&#xff0c;以在不同操作系统上运行的工具软件 什么是基础镜像 选一个基础操作系统和语言后&#xff0c;将对应的文件系统、依赖库、配置等打包为一个类似压缩包的文件&#xff0c;就是基础镜像 什么是…

科学防治激素脸 荟敏堂中医治则有绝招

仟江水商业电讯&#xff08;7月12日 北京 委托发布&#xff09;最近几年&#xff0c;“激素脸”一词出现在我们生活中的频率似乎越来越高。很多人都曾经或者正在饱受其苦&#xff1a;皮肤瘙痒、紧绷、刺痛&#xff0c;甚至出现红斑、红血丝、表皮萎缩、粗糙、脱屑等等&#xff…

AI在软件开发中的角色:辅助创新还是自动化取代?

文章目录 每日一句正能量前言&#xff1a;人工智能与软件开发的未来交汇点AI工具现状AI对开发者的影响工作方式的改变需要掌握的新技能保持竞争力的策略结论 AI开发的未来AI在软件开发领域的未来发展方向AI是否可能完全取代开发者如何在AI时代规划开发者的职业发展结论 后记&am…

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

【项目实战】深入解析HTTP状态码:400 Bad Request

在互联网的日常使用中&#xff0c;HTTP状态码是服务器用来回应客户端请求的一种标准化方式。当你在浏览器地址栏敲入一个网址或在应用中发起一个请求时&#xff0c;背后就是HTTP协议在起作用。今天&#xff0c;我们将聚焦于一个特别常见但经常被误解的状态码——400 Bad Reques…

Golang | Leetcode Golang题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; type MyBst struct {root *TreeNodenodeNum map[*TreeNode]int // 统计以每个结点为根结点的子树的结点数&#xff0c;并存储在哈希表中 }// 统计以 node 为根结点的子树的结点数 func (t *MyBst) countNodeNum(node *TreeNode) int {if…

大数据时代的数据库管理:分库与读写分离的重要性

前言 “分库”和“数据库拆分”这两个术语在数据库领域经常被提及&#xff0c;通常指的是类似的概念&#xff0c;但在细节上有所区别。分库通常指的是将一个大型数据库中的数据分布到多个较小的数据库中&#xff0c;以提高性能和可管理性。而数据库拆分则更广泛地指将数据库…

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一&#xff1a;修改Tomcat配置&#xff08;推荐&#xff09;方法二&#xff1a;使用URLEncoder和URLDecoder&#xff08;不推荐用于GET请求乱码&#xff09;方法三&#xff1a;String类编解码&#xff08;不直接解决乱…

深入理解C++多态性:虚函数、纯虚函数与抽象类的奥秘

深入理解C多态性&#xff1a;虚函数、纯虚函数与抽象类的奥秘 在C这门强大而灵活的编程语言中&#xff0c;多态性&#xff08;Polymorphism&#xff09;是一个核心概念&#xff0c;它允许我们通过统一的接口&#xff08;通常是基类指针或引用&#xff09;来访问不同对象&#…

DBA 数据库管理 部署Mysql 服务,基础查询

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

C#高级开发 线上面试题20240711

1.事件与委托什么关系,委托与lamda表达式是什么关系? 委托(Delegate) 是一种类型,它定义了方法的类型,使得可以将方法作为参数进行传递。委托是引用类型,它封装了一个或多个方法。委托的实例可以像调用方法一样被调用,而实际上它调用的是它所封装的方法。 事件(Event…

我们水冷电阻器支持高脉冲负载和高抗振能

我们电阻器是液冷电阻器&#xff0c;与风冷型电阻器相比&#xff0c;尺寸非常小。它们支持高脉冲负载和高抗振能力。 水冷电阻器具有完全绝缘的铝制外壳&#xff0c;带有液体冷却通道。主要的电阻元件是由厚膜浆料制成&#xff0c;具有低热漂移和出色的电阻精度。电阻元件嵌入氧…

如何实现接口的幂等性

1&#xff0c;什么是幂等性 即相同的多次请求&#xff0c;只执行一次。 2&#xff0c;简述怎么保证幂等性&#xff1f; 单机部署的场景 使用唯一标识符: 在客户端发起请求时&#xff0c;附加一个唯一的请求标识符&#xff08;如 UUID&#xff09;。服务端接收到请求后&#…

Ubuntu20.04.6新系统没有wifi驱动(已解决)

Ubuntu20.04.6新系统没有wifi驱动&#xff08;已解决&#xff09; 问题描述硬件环境无线网卡驱动安装网络查看驱动安装 其他因素参考文献 问题描述 在装完ubuntu20.04.6之后发现网络设置里没有无线网。缺少无线网卡驱动。 硬件环境 电脑&#xff1a;i9-13900H 无线网卡&…