1.滑动窗口算法
类型题目
用于处理连续的数组数据或者字符串数据,常用来提取数据中的子数组或者子串。
- 滑动窗口的使用方式:
- 根据题目要求先设置窗口大小
- 设置滑动范围
- 滑动窗口
- 退出
- 自我感觉滑动窗口的方式和队列的运行方式有很多相似的地方,就比如:
-
根据题意设置队列大小 ------- 设置窗口大小
-
队列先进先出的运行模式 ------- 窗口中的数据先进先出
- 但滑动窗口的特点是窗口可以是静态也可以是动态。
- 案例一就是动态窗口,当选择值已经不能再改变的时候就可以通过动态改变窗口中的数据来判断是否是我们需要的值。
- 案例二则是静态窗口,因为每道题的题意原因所以不能妄下定论说每个知识点的必然性。
使用步骤
-
先对定长长度范围内做一次循环(注意会不会窗口比长度还大)
进行判断–先构造出窗口
-
对后续的作循环,将窗口向后推进,
对每个进来的进行判断,每次和最值比较
-
返回前注意是不是要再做一次判断
1456. 定长子串中元音的最大数目
给你字符串
s
和整数k
。请返回字符串
s
中长度为k
的单个子字符串中可能包含的最大元音字母数。英文中的 元音字母 为(
a
,e
,i
,o
,u
)。
-
基础知识问题
-
Java字符串不能直接使用s[] (这是c++的东西)
改成s.charAt(i);
-
多个数字判断大小可以用Math.max()。
-
单引号才是字符,双引号是字符串。
-
if里面只能是boolean类型,不能用int类型
-
-
class Solution { public static int maxVowels(String s, int k) { int maxnum = 0; int curnum = 0; int length = s.length(); int i; for(i = 0; i < k && i <length; i++){ //函数返回的是int类型,所以无需使用if(也没法用,只能boolean) //直接加减效果更佳,代码更简洁 curnum += IsVovel(s.charAt(i)); } maxnum = Math.max(curnum, maxnum); for (i = k; i < length; i++) { curnum += IsVovel(s.charAt(i))-IsVovel(s.charAt(i-k)); maxnum = Math.max(curnum, maxnum); } return maxnum; } //单独用函数进行原因判断 public static int IsVovel(char ch){ return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ? 1 : 0; } }