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:滑动窗口
- 维持一个滑动窗口,窗口大小保持k不变,
- 初始化将滑动窗口压满,取得第一个滑动窗口的目标值
- 继续滑动窗口,每往前滑动一次,需要删除一个和添加一个元素
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 右移,更新计数,直到符合条件。
相关文章:
LeetCode HOT100(三)滑动窗口
子数组最大平均数 I (非hot100,但是滑动窗口的思想可以很好的体现,入门滑动窗口很好的题) 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数…...

数学系C++ 排序算法简述(八)
目录 排序 选择排序 O(n2) 不稳定:48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化: 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…...

记一下blender曲线阵列
先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器,然后再给他添加一个curve修改器,使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后,死活无法沿着曲线阵列ÿ…...

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘
文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言,在自己的电脑上搭建…...
react hooks antd 父组件取子组件form表单的值
在React中,父组件可以使用ref来访问子组件的方法或属性。子组件包含一个表单, 使用forwardRef、useImperativeHandle:forwardRef允许组件使用ref将 DOM 节点暴露给父组件,使用useImperativeHandle暴露方法给父组件。 子组件&#…...

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置概述】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…...

大数据如何推动工业数字化发展?
随着工业领域的深刻变革,数字化成为了驱动行业前行的核心力量。在这一转变中,大数据扮演着不可或缺的角色。它不仅为企业提供了洞察市场趋势、消费者行为等关键信息的窗口,还为企业优化生产流程、提升产品质量以及推动创新提供了强有力的支持…...

计算机网络浅谈—什么是 OSI 模型?
开放系统通信(OSI)模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型? 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型,支持各种通信系统使用标准协议进行通信。简单而言,OSI 为保证…...

浪潮服务器内存物理插槽位置
浪潮服务器内存物理插槽位置 如下图所示...
windows node降级到指定版本
要在Windows上将Node.js降级到指定版本,你可以使用nvm(Node Version Manager)来管理和切换不同的Node.js版本。以下是使用nvm降级Node.js的步骤: 如果尚未安装nvm,请访问https://github.com/coreybutler/nvm-windows …...

EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)
1. 引言 在现代虚拟化技术的快速发展中,VMware ESXi 作为领先的虚拟化平台,凭借其高性能、稳定性和丰富的功能,广泛应用于企业和个人用户。ESXi 能有效地提高硬件资源利用率,并简化 IT 基础设施的管理。然而,如何在 V…...

断电的固态硬盘数据能放多久?
近日收到一个网友的提问,在这里粗浅表达一下见解: “网传固态硬盘断电后数据只能放一年,一年之后就会损坏。但是我有一个固态硬盘已经放了五六年了(上次通电还是在2018年左右,我读初中的时候),…...

Neo4j安装
下载地址:Neo4j Deployment Center - Graph Database & Analytics 1.安装jdk,Neo4j 3.0需要jdk8,2.3.0之前的版本建议jdk7。Neo4j最新版本5.21.2,对应jdk版本17 2.将下载的zip文件解压到合适路径。 3.设置环境变量NEO4J_H…...

基于Java+SpringMvc+Vue技术的就医管理系统设计与实现系统(源码+LW+部署讲解)
目录 界面展示 第六章 部分代码实现 6.1 Spring boot 配置代码 6.2 用户管理及登录登出代码 6.3 Md5 加密算法代码 6.4 部分数据库代码 六、论文参考: 七、其他案例: 系统介绍: 就医管理系统,也称为医院管理系统&#…...
Transformer学习过程中常见的问题与解决方案 - Transformer教程
在机器学习领域,Transformer模型已经成为了处理自然语言处理(NLP)任务的主流工具。然而,在学习和使用Transformer的过程中,很多人会遇到各种各样的问题。今天我们就来聊一聊Transformer学习过程中常见的问题以及对应的…...

Linux进程间通信:匿名管道 命名管道
Linux进程间通信:匿名管道 &命名管道 一、进程间通信目的二、什么是管道三、匿名管道创建3.1 系统调用原型3.2 匿名管道创建 四、内核创建匿名管道过程五、匿名管道性质5.1 匿名管道的4种特殊情况5.2 匿名管道的5种特性5.3 测试源代码 六、命名管道6.1 创建命名…...

【数据结构】(C语言):二叉搜索树(不使用递归)
二叉搜索树: 非线性的,树是层级结构。基本单位是节点,每个节点最多2个子节点。有序。每个节点,其左子节点都比它小,其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。 …...

Fastapi在docekr中进行部署之后,uvicorn占用的CPU非常高
前一段接点小活,做点开发,顺便学了学FASTAPI框架,对比flask据说能好那么一些,至少并发什么的不用研究其他的asgi什么的,毕竟不是专业开发,能少研究一个东西就省了很多的事。 但是部署的过程中突然之间在do…...
Pandas数据可视化宝典:解锁图形绘制与样式自定义的奥秘
Pandas数据可视化宝典:解锁图形绘制与样式自定义的奥秘 引言 数据可视化是将数据以图形或图像的形式展示出来,使复杂的数据更容易被人类理解和分析。在数据分析、商业智能、科学研究等领域,数据可视化都扮演着至关重要的角色。Pandas作为一…...

2024前端面试真题【JS篇】
DOM DOM:文本对象模型,是HTML和XML文档的编程接口。提供了对文档的结构化的表述,并定义可一种方式可以使从程序中对该结构进行访问,从而改变文档的结构、样式和内容。 DOM操作 创建节点:document.createElement()、do…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...