leetcode滑动窗口问题
想成功先发疯,不顾一切向前冲。
第一种
定长滑动窗口
. - 力扣(LeetCode)1456.定长子串中的元音的最大数目. - 力扣(LeetCode)
No.1
定长滑窗套路
我总结成三步:入-更新-出。
1. 入:下标为 i 的元素进入窗口,更新相关统计量。如果 i<k−1 则重复第一步。
2. 更新:更新答案。一般是更新最大值/最小值。
3. 出:下标为 i−k+1 的元素离开窗口,更新相关统计量。
以上三步适用于所有定长滑窗题目。
class Solution {public int maxVowels(String S, int k) {char[] s = S.toCharArray();int ans = 0;int temp = 0;for (int i = 0; i < s.length; i++) {// 1. 进入窗口if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {temp++;}if (i < k - 1) { // 窗口大小不足 kcontinue;}// 2. 更新答案ans = Math.max(ans, temp);// 3. 离开窗口char out = s[i - k + 1];if (out == 'a' || out == 'e' || out == 'i' || out == 'o' || out == 'u') {temp--;}}return ans;}
}
复杂度分析
- 时间复杂度:O(n),其中 n 是 s 的长度。
- 空间复杂度:O(1)。仅用到若干额外变量。
这里对于字符串的处理及java的String类做一个详细说明
toCharArray()是 Java 中
String类的一个方法,用于将字符串转换为字符数组 (char[])。每个字符数组中的元素对应于字符串中的一个字符。用法
String str = "Hello, World!"; char[] charArray = str.toCharArray();解释
str是一个String对象。- 调用
str.toCharArray()会将字符串"Hello, World!"转换为一个字符数组。charArray将包含:{'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'}常见用途
- 字符串处理:你可以更方便地遍历字符串中的每个字符。
- 字符修改:字符数组可以修改单个字符,而
String是不可变的(即一旦创建,不能更改其内容)。1.
length()- 作用: 返回字符串的长度(字符数)。
- 示例:
String str = "Hello, World!"; int len = str.length(); // len = 132.
charAt(int index)- 作用: 返回指定索引处的字符,索引从 0 开始。
- 示例:
String str = "Hello"; char ch = str.charAt(1); // ch = 'e'3.
substring(int beginIndex)/substring(int beginIndex, int endIndex)- 作用: 返回从指定索引开始或在索引区间内的子字符串。
- 示例:
String str = "Hello, World!"; String subStr1 = str.substring(7); // subStr1 = "World!" String subStr2 = str.substring(0, 5); // subStr2 = "Hello"4.
indexOf(String str)/indexOf(char ch)- 作用: 返回指定字符或子字符串在原字符串中第一次出现的索引,若未找到则返回 -1。
- 示例:
String str = "Hello, World!"; int index1 = str.indexOf('W'); // index1 = 7 int index2 = str.indexOf("World"); // index2 = 75.
toUpperCase()/toLowerCase()- 作用: 返回将字符串转换为大写或小写后的新字符串。
- 示例:
String str = "Hello"; String upperStr = str.toUpperCase(); // upperStr = "HELLO" String lowerStr = str.toLowerCase(); // lowerStr = "hello"6.
trim()- 作用: 去除字符串开头和结尾的空白字符。
- 示例:
String str = " Hello, World! "; String trimmedStr = str.trim(); // trimmedStr = "Hello, World!"7.
replace(char oldChar, char newChar)/replace(CharSequence target, CharSequence replacement)- 作用: 替换字符串中的指定字符或子字符串。
- 示例:
String str = "Hello, World!"; String replacedStr1 = str.replace('o', 'a'); // replacedStr1 = "Hella, Warld!" String replacedStr2 = str.replace("World", "Java"); // replacedStr2 = "Hello, Java!"8.
equals(Object anObject)/equalsIgnoreCase(String anotherString)- 作用: 比较两个字符串的内容是否相等。
equalsIgnoreCase不区分大小写。- 示例:
String str1 = "Hello"; String str2 = "hello"; boolean isEqual = str1.equals(str2); // isEqual = false boolean isEqualIgnoreCase = str1.equalsIgnoreCase(str2); // isEqualIgnoreCase = true9.
split(String regex)- 作用: 根据正则表达式将字符串分割为子字符串数组。
- 示例:
String str = "apple,banana,orange"; String[] fruits = str.split(","); // fruits = ["apple", "banana", "orange"]10.
contains(CharSequence s)- 作用: 判断字符串是否包含指定的字符序列。
- 示例:
String str = "Hello, World!"; boolean containsHello = str.contains("Hello"); // containsHello = true
No.2
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。
返回可能的 最小差值 。
示例 1:
输入:nums = [90], k = 1 输出:0 解释:选出 1 名学生的分数,仅有 1 种方法: - [90] 最高分和最低分之间的差值是 90 - 90 = 0 可能的最小差值是 0
示例 2:
输入:nums = [9,4,1,7], k = 2 输出:2 解释:选出 2 名学生的分数,有 6 种方法: - [9,4,1,7] 最高分和最低分之间的差值是 9 - 4 = 5 - [9,4,1,7] 最高分和最低分之间的差值是 9 - 1 = 8 - [9,4,1,7] 最高分和最低分之间的差值是 9 - 7 = 2 - [9,4,1,7] 最高分和最低分之间的差值是 4 - 1 = 3 - [9,4,1,7] 最高分和最低分之间的差值是 7 - 4 = 3 - [9,4,1,7] 最高分和最低分之间的差值是 7 - 1 = 6 可能的最小差值是 2
class Solution {public int minimumDifference(int[] nums, int k) {Arrays.sort(nums);int len = nums.length;int res = Integer.MAX_VALUE;for (int i = 0; i <= len - k; i++) {res = Math.min(res,nums[i+k-1]-nums[i]);}return res;}
}
这个题要注意的地方是:i 只有在 <= len-k 的条件下可以运行,在后续的nums[ ]读数的时候左右节点要进行移动读数;
No.3
1343. - 力扣(LeetCode)
class Solution {public int numOfSubarrays(int[] arr, int k, int threshold) {int len = arr.length;int ans = 0;for (int i = 0; i < k; i++) {ans += arr[i];}int res = 0;
//很典型的一个坑,初次忘记考虑当 i = 0 取 k 个数的时候的 ans 的大小的判断if(ans>=k*threshold){res++;}for (int i = k; i < len; i++) {ans = ans-arr[i-k] +arr[i];if(ans/k>=threshold){res++;}}return res;}
}
不定长滑动窗口(求最长或最大)
No.1
3.无重复字符的最长子串
我认为思考的重点在于滑动窗口的起始位置与一般规律的总结:
我们不妨以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:
以 (a)bcabcbb 开始的最长字符串为 (abc)abcbb;
以 a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;
以 ab(c)abcbb 开始的最长字符串为 ab(cab)cbb;
以 abc(a)bcbb 开始的最长字符串为 abc(abc)bb;
以 abca(b)cbb 开始的最长字符串为 abca(bc)bb;
以 abcab(c)bb 开始的最长字符串为 abcab(cb)b;
以 abcabc(b)b 开始的最长字符串为 abcabc(b)b;
以 abcabcb(b) 开始的最长字符串为 abcabcb(b)。
class Solution {public int lengthOfLongestSubstring(String S) {int len = S.length();char[] s = S.toCharArray();Set<Character> hs = new HashSet<>();int res = 0;for (int left = 0, right = 0; right < len; right++) {char ch = s[right];while (hs.contains(ch)) {hs.remove(s[left]);left++;}hs.add(s[right]);res = Math.max(res, right - left + 1);}return res;}
}
right: 当前子串的右边界索引。left: 当前子串的左边界索引。
子串的长度计算公式是 右边界索引 - 左边界索引 + 1。寓意着包含左右边界的字符串
No.2
1695.删除子数组的最大得分. - 力扣(LeetCode)
给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。
返回 只删除一个 子数组可获得的 最大得分 。
如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个子数组。
示例 1:
输入:nums = [4,2,4,5,6] 输出:17 解释:最优子数组是 [2,4,5,6]
示例 2:
输入:nums = [5,2,1,2,5,2,1,2,5] 输出:8 解释:最优子数组是 [5,2,1] 或 [1,2,5]
class Solution {public int maximumUniqueSubarray(int[] nums) {int len = nums.length; // 获取数组的长度Set<Integer> hs = new HashSet<>(); // 创建一个 HashSet 用来存储当前子数组的元素int res = 0, ans = 0; // res 用于存储当前子数组的元素和,ans 用于存储最大得分int i = 0; // i 指针,表示当前子数组的起点// j 指针表示当前子数组的终点for (int j = 0; j < len; j++) {// 当 hs 中已经包含 nums[j] 时,说明存在重复元素,需要移动 i 指针while (hs.contains(nums[j])) {hs.remove(nums[i]); // 从 HashSet 中移除子数组的第一个元素res -= nums[i]; // 从当前子数组的和中减去该元素的值i++; // 移动起点指针 i}hs.add(nums[j]); // 将 nums[j] 添加到 HashSet 中res += nums[j]; // 将 nums[j] 的值加到当前子数组的和中ans = Math.max(res, ans); // 更新最大得分}return ans; // 返回只删除一个子数组可以获得的最大得分}
}
No.3 上难度
1004.最大连续1的个数III. - 力扣(LeetCode)
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
示例 1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释:[1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:
输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3 输出:10 解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 10。
这个题有个特点就是数组内只有 0 ,1
那我们就围绕这一特点进行攻破,及,cnt += 1 - nums[right]; // 如果 nums[right] 是 0,`cnt` 增加1;如果是 1,`cnt` 不变
class Solution {public int longestOnes(int[] nums, int k) {int cnt = 0; // 记录当前窗口内0的个数int ans = 0; // 记录最长的全1子数组的长度int left = 0; // 滑动窗口的左边界// 右边界 `right` 从 0 开始遍历整个数组for (int right = 0; right < nums.length; right++) {cnt += 1 - nums[right]; // 如果 nums[right] 是 0,`cnt` 增加1;如果是 1,`cnt` 不变// 如果当前窗口内的0的个数超过了允许的k个,则需要收缩窗口while (cnt > k) {cnt -= 1 - nums[left]; // 移动左边界,移除 `nums[left]` 的影响left++; // 将左边界右移}// 更新最长子数组的长度ans = Math.max(ans, right - left + 1);}return ans; // 返回找到的最长的全1子数组的长度}
}
相关文章:
leetcode滑动窗口问题
想成功先发疯,不顾一切向前冲。 第一种 定长滑动窗口 . - 力扣(LeetCode)1456.定长子串中的元音的最大数目. - 力扣(LeetCode) No.1 定长滑窗套路 我总结成三步:入-更新-出。 1. 入:下标为…...
QT 控件使用案例
常用控件 表单 按钮 Push Button 命令按钮。Tool Button:工具按钮。Radio Button:单选按钮。Check Box:复选框按钮。Command Link Button:命令链接按钮。Dialog Button Box:按钮盒。 容器组控件(Containers) Group Box…...
【MySQL 10】表的内外连接 (带思维导图)
文章目录 🌈 一、内连接⭐ 0. 准备工作⭐ 1. 隐式内连接⭐ 2. 显式内连接 🌈 二、外连接⭐ 0. 准备工作⭐ 1. 左外连接⭐ 2. 右外连接 🌈 一、内连接 内连接实际上就是利用 where 子句对两张表形成的笛卡儿积进行筛选,之前所有的…...
【C语言】:与文件通信
1.文件是什么? 文件通常是在磁盘或固态硬盘上的一段已命名的存储区。C语言把文件看成一系列连续的字节,每个字节都能被单独的读取。这与UNIX环境中(C的 发源地)的文件结构相对应。由于其他环境中可能无法完全对应这个模型&#x…...
HTTPS通讯全过程
HTTPS通讯全过程 不得不说,https比http通讯更加复杂惹。在第一次接触https代码的时候,不知道为什么要用用证书,公钥是什么?私钥是什么?他们作用是什么?非对称加密和对称加密是啥?天,…...
建筑物规则化(实现) --- 特征边分组、重构、直角化
规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛,在数据获取过程中,受GPS精确度、遥感影像分辨率或人为因素的影响,数据往往存在不同程度的误差。其中,图像分割、深度学习…...
pytorch的优化
在pytorch中,tensor是基于numpy与array的。内存共享。 在pythorch中,自定义层是继承nn.Module。将层与模型看成是模块,层与模型堪称模块,两者之间没有明确界限,定义方式与定义模型一样_init_与forward。 1、先定义全…...
React 入门第一天:从Vue到React的初体验
作为一名合格的前端工程师,怎么能只会Vue呢?学习React不仅是一场新技术的探索,更是对前端开发思维的一次重新审视。在这里,我将分享学习React的心得,希望能帮助那些和我一样从Vue转向React的开发者。 1. 为什么选择Re…...
Golang | Leetcode Golang题解之第357题统计各位数字都不同的数字个数
题目: 题解: func countNumbersWithUniqueDigits(n int) int {if n 0 {return 1}if n 1 {return 10}ans, cur : 10, 9for i : 0; i < n-1; i {cur * 9 - ians cur}return ans }...
【Linux】 gdb-调试器初入门(简单版使用)
🔥系列文章:《Linux入门》 目录 一、背景 二、什么是GDB 🌷定义 🌷GDB调试工具---提供的帮助 三、GDB的安装教程-Ubuntu 🌷gdb的安装 四、哪类程序可被调试 🌷程序的发布方式 🌷Debug版…...
Spring 的事务支持
文章目录 1、Spring如何管理事务2、编程式事务1_基本用法2_创建TransactionTemplate实例3_TransactionTemplate的内部结构4_总结 3、声明式事务1_使用Transactional注解2_事务的传播行为3_配置4_总结 1、Spring如何管理事务 Spring为事务管理提供了一致的编程模板,…...
基于STM32开发的智能家居照明控制系统
目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集显示与控制逻辑Wi-Fi通信应用场景 家庭智能照明办公室节能照明控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能家居照明控制系统通过集成光照传感器、继…...
程序员的底层思维~张建飞
前言 ◆ 成人学习的目的不是获取更多的信息量,而是学习更好的思维模型。 ◆ 好的思维能力是可以被复制和迁移的,它应该是普适的,而不应该有行业的界限。 第一部分 基础思维能力 ◆ 因为语言的抽象性,我在团队中会要求大家使用通用…...
美股收涨,半导体板块领涨;苹果iPhone出货预测上调
市场概况 在昨夜的交易中,美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%,纳斯达克综合指数上涨2.34%,标准普尔500指数上涨1.61%。值得注意的是,英伟达股票涨幅近4%,推动了科技股的整体表现。美国十年期国债收益…...
[学习笔记]在不同项目中切换Node.js版本
文章目录 使用 Node Version Manager (NVM)安装 NVM使用 NVM 安装和切换 Node.js 版本为项目指定 Node.js 版本 使用环境变量指定 Node.js安装多个版本的 Node.js设置环境变量验证配置使用 npm 脚本切换 在开发中,可能会遇到不同的Vue项目需要不同的Node.js…...
SOL项目开发代币DApp的基本要求、模式创建与海外宣发策略
Solana(SOL)作为一个高性能区块链平台,以其快速的交易速度和低交易成本吸引了大量开发者和投资者。基于Solana开发的去中心化应用程序(DApp)和代币项目正逐步成为区块链领域的重要组成部分。要成功开发并推广一个SOL项…...
如何在 FastReport .NET 中构建和安装 Postgres 插件
FastReport .NET 是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案。 功能非常丰富,功能广泛。今天我们将介绍如何使用报表设计器的 FastReport 插件连接数据库。 FastReport .NET 是适用于.NET Core 3,ASP.NET,MVC和Windows窗体…...
JVM指令重排序
文章目录 什么是指令重排序编译器优化JIT 编译优化处理器优化重排序数据依赖性 硬件层的内存屏障指令重排的代码验证好处减少管道阻塞提高缓存利用率利用并行执行单元性能提升更好地利用硬件资源 问题内存可见性问题编程复杂性增加调试困难 解决方案:Java内存模型&a…...
改造字典关键字:
怎样把第一个关键字的值都 加到所有关键字上? {type: 7, typenum: , typemon: } 我们可以使用字典的keys()方法来获取所有的关键字,然后通过遍历字典的方式将第一个关键字的值添加到其他关键字的名称上。以下是一个示例代码: data {type: …...
Neo4j 图数据库入门
图形数据库存储节点和关系,而不是表或文档。数据的存储方式就像你在白板上勾画想法一样。您的数据存储不受预定义模型的限制,允许以非常灵活的方式考虑和使用它。 一、核心概念:属性图形模型 Neo4j使用属性图数据库模型。图数据结构由节点(离…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
