当前位置: 首页 > news >正文

微信公众号自己微网站吗有哪些可以做兼职的翻译网站

微信公众号自己微网站吗,有哪些可以做兼职的翻译网站,网站建设交接表,无锡短视频推广目录 前言 一、滑动窗口基本思路 1.1 什么是窗口 1.2 滑动窗口两种基本类型 1.3算法框架 二、固定大小窗口题目解析 1.1456. 定长子串中元音的最大数目 2.643.子数组最大平均数 三、可变大小窗口 1.3. 无重复字符的最长子串(hot100) 2.438. 找到字符串中…

目录

前言

一、滑动窗口基本思路

1.1 什么是窗口

1.2 滑动窗口两种基本类型

1.3算法框架

二、固定大小窗口题目解析

1.1456. 定长子串中元音的最大数目

2.643.子数组最大平均数

三、可变大小窗口

1.3. 无重复字符的最长子串(hot100)

2.438. 找到字符串中所有字母异位词(hot100)

四、

核心思想

总结


前言

滑动窗口算法是处理数组和字符串子问题的高效方法,通过维护一个动态调整的区间(窗口),将时间复杂度从 O (n²) 优化到 O (n)。

本文将用 Java 实现各类滑动窗口问题


一、滑动窗口基本思路

1.1 什么是窗口

我们用生活中的例子进行类比:当你在超市排队结账时,队伍作为一个数组,你所观察的“前三个人”就是一个窗口

  • 窗口大小:3个人(固定大小)
  • 窗口滑动:当第一个人结账离开,你观察的窗口就像右滑动1位,变成了"第2~4个人"。

1.2 滑动窗口两种基本类型

根据窗口大小是否固定,分为两类:

类型特点应用
固定大小窗口窗口长度始终不变,仅通过右移更新窗口内容求数组中长度为 k 的子数组的最大和,求字符串中长度为 k 的子串的最大元音数
可变大小窗口窗口长度可动态扩大或缩小,通过 “右指针扩大窗口、左指针缩小窗口” 调整求最长无重复子串、求满足和≥target 的最短子数组

1.3算法框架

无论是上述那种类型,滑动窗口都需要依赖两个核心指针(左指针left,右指针right)来维护窗口

  1. 初始化:定义left=0(窗口左边界),right=0(窗口右边界),并初始化结果变量(如最大和、最长长度)和窗口状态变量(如当前窗口和、当前窗口内元素集合);
  2. 扩展窗口:移动right指针,将新元素加入窗口,更新窗口状态;
  3. 调整窗口:根据问题约束(如窗口大小固定、窗口内元素重复),判断是否需要移动left指针缩小窗口,更新窗口状态;
  4. 更新结果:在每次窗口调整后,判断是否满足结果条件,更新最终结果;
  5. 终止条件right指针遍历完数组 / 字符串。

二、固定大小窗口题目解析

1.1456. 定长子串中元音的最大数目

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(aeiou)。

class Solution {public int maxVowels(String S, int k) {char[] s = S.toCharArray();int ans = 0; // 记录最大元音数int vowel = 0; // 当前窗口的元音数for (int i = 0; i < s.length; i++) { // i为右边界// 入:新字符进入窗口,更新元音计数if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {vowel++;}// 窗口未满(长度 < k)时,只进不出,跳过后续步骤if (i < k - 1) { continue;}// 2. 更新:窗口满了(长度=k),记录当前最大值ans = Math.max(ans, vowel);// 3. 出:左边界字符离开窗口,更新元音计数(为下一次滑动做准备)char out = s[i - k + 1]; // 左边界L = i - k + 1(因为窗口长度为k,L= i -k +1)if (out == 'a' || out == 'e' || out == 'i' || out == 'o' || out == 'u') {vowel--;}}return ans;}
}

2.643.子数组最大平均数

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案。

class Solution {public double findMaxAverage(int[] nums, int k) {double sum = 0;// 先计算第一个窗口的和for (int i = 0; i < k; i++) {sum += nums[i];}// 初始化最大平均值为第一个窗口的平均值double maxAvg = sum / k;// 滑动窗口处理后续子数组for (int i = k; i < nums.length; i++) {// 窗口右边界加入新元素,左边界移除旧元素sum = sum + nums[i] - nums[i - k];// 计算当前窗口平均值,更新最大平均值double currentAvg = sum / k;maxAvg = Math.max(maxAvg, currentAvg);}return maxAvg;}
}

三、可变大小窗口

1.3. 无重复字符的最长子串(hot100)

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

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希表:存储字符与其最后出现位置的映射// key: 字符,value: 该字符在字符串中最后出现的索引Map<Character, Integer> charIndex = new HashMap<>();int maxLen = 0; // 记录最长无重复子串的长度,初始为0int left = 0; // 左指针,标记当前窗口起始位置for (int right = 0; right < s.length(); right++) {// 获取当前右指针指向的字符char c = s.charAt(right);// 若字符已存在且索引在当前窗口内,则移动左指针至重复字符的后一项索引if (charIndex.containsKey(c) && charIndex.get(c) >= left) {left = charIndex.get(c) + 1;}charIndex.put(c, right); // 更新字符最新索引maxLen = Math.max(maxLen, right - left + 1);//计算当前窗口长度(right - left + 1)}return maxLen;}
}

2.438. 找到字符串中所有字母异位词(hot100)

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

class Solution {//因为要找 长度固定(和 p 长度相同) 的子串,且需要对比字符频率,所以用 滑动窗口 + 字符频率数组 的思路public List<Integer> findAnagrams(String s, String p) {List<Integer> result=new ArrayList<>();int slen=s.length();int plen=p.length();//固定窗口大小// 边界条件:如果s的长度小于p,不可能存在符合条件的子串,直接返回空列表if(slen<plen){return result;}// 定义两个数组用于统计字符频率(仅适用于小写字母)// 索引0-25分别对应字母a-zint[] sCount = new int[26];int[] pCount = new int[26];//处理s中前p.length()个字符,初始化s和p的频率数组for (int i = 0; i < plen; i++) {//p.charAt(i) - 'a':将字符转换为 0 - 25 的整数(因为题目中是小写字母,a 对应 0,b 对应 1,……,z 对应 25 ),这样就把字符映射到了 pCount 数组的索引上。pCount[p.charAt(i) - 'a']++;sCount[s.charAt(i) - 'a']++;}//初始化窗口状态变量---初始窗口匹配检查(s的前pLen个字符)是否与p是字母异位词if(isEqual(sCount,pCount)){result.add(0);//返回子串起始索引}//滑动窗口遍历剩余字符for(int right=plen;right<slen;right++){//右指针右移,加入新字符sCount[s.charAt(right)-'a']++;// 左指针右移,移除旧字符(窗口左端移出的字符)sCount[s.charAt(right - plen) - 'a']--;// 检查当前窗口是否匹配if (isEqual(sCount, pCount)) {result.add(right - plen + 1);}}return result;}// 辅助方法:判断两个频率数组是否相等private boolean isEqual(int[] a, int[] b) {for (int i = 0; i < 26; i++) {if (a[i] != b[i]) return false;}return true;}
}

四、核心思想

  • 维护左右两个指针表示窗口的边界
  • 初始化结果变量/初始化窗口状态变量
  • 根据问题类型决定窗口是固定大小还是可变大小
  • 右指针通常用于扩大窗口,左指针用于缩小窗口
  • 每次调整窗口后更新结果


总结

以上即对滑动窗口算法的解析,希望自己能在接下来时间坚持把算法整起来了,不要拖拉了。

http://www.dtcms.com/a/459189.html

相关文章:

  • 精品课程网站建设步骤培训网站开发需求说明书
  • 小型网站制作深圳wordpress前端新增头像上传
  • 优秀国外网站设计赏析网站怎样做全国地区推广
  • 淘宝网站那个做的营销型网站建立
  • 徐州祥云做网站网络营销公司如何建立
  • 公司网站首页模板网站改版专题页
  • 桂林市生活网官方网站普陀网页设计
  • 网站无障碍建设百度seo权重
  • 免费电商网站建设平台php做网站首页的代码
  • 免费域名做网站遵义在线新闻中心
  • 微网站开发平台免费wordpress 使用ip访问
  • 一_建设网站前的市场分析做外贸学习网站
  • 上饶网站建设公司国家职业证书查询网入口
  • 潜江建设网站用人名做网站域名
  • 第五步:解决跨域问题,返回 token,校验token, 并定义将接收的参数全局存储的方法
  • 福建城建设厅官方网站秦皇岛信息平台
  • 云主机做网站网页制作软件ai
  • 网站建设科目做网站维护价格
  • 猎头公司应坚持的原则有seo推广公司网站模板
  • 营销型网站用什么模版合适陈幼坚设计公司官网
  • 工作室网站源码php学网页设计哪个培训学校好
  • seo网站设计就业前景wordpress sydney
  • 宝应做网站汕头小程序开发
  • 沈阳做网站公司哪家好网站开发遵循的原则
  • 网站被降权重新做网站郑州专业网站建设公司详情
  • 网站开发维护任职要求宝安中心地铁站是几号线
  • 网站运营难做嘛禅城网站建设多少钱
  • 可以盗链图片的网站重庆大型的网站建设
  • day05-问答系统
  • 永久免费的wap建站平台泉州优化公司