持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
滑动窗口,大家应该都不陌生吧,我们今天用Java语言来实现几个常见的滑动窗口题目
- 固定窗口
package 滑动窗口;
import java.util.Scanner;
public class 固定窗口 {
public static void main(String[] args) {
// 俩个相邻的长度为4的窗口,下一个窗口一定比上一个窗口少一个数据,以及多另一个数据
// 直接沿用之前的数据,并且减去前面的,加上后来的,就是 下一个窗口的值!
//题目:给定一个整数数组arr和俩个整数k和threshold,请你返回长度为k且平均值大于等于threshold的子数组的数目
int[] arr1={1,2,3,4,5};
Scanner a = new Scanner(System.in);
int k = a.nextInt();
int threshold = a.nextInt();
int i,sum = 0, ret = 0;
threshold *= k;
for(i = 0; i<k; ++i){
sum += arr1[i];
//前k个
}
if(sum>=threshold) ++ret;
for(i = k; i<arr1.length; ++i){
sum-=arr1[i-k];
sum+=arr1[i];
if(sum>=threshold) ++ret;
}
System.out.println(ret);
}
}
- 可变窗口
package 滑动窗口;
import org.w3c.dom.ls.LSOutput;
public class 可变窗口 {
//解决在s中最长不含重复子串的字符串
//1.定义一个滑动窗口,初始化为空窗口,也就是i= 0,j = -1
//2.然后,不断的向右移动滑动窗口的右边界,同时记录当前字符的出现次数,可以用一个哈希表来记录
//3.当第j个字符在哈希表中出现超过 1次 ,则移动滑动窗口的左边界,同时更新对应字符的出现次数,主要这里要循环迭代计算
//4.当右边界枚举到整个字符串结尾,则结束计算
public static void main(String[] args) {
int[] s = {1, 2, 3, 4, 5, 6, 7, 8};
int n = s.length;
int[] hash = new int[256];
int max = 0;
int i = 0, j = -1;
while (j < n - 1) {
++j;
++hash[s[j]];
while (hash[s[j]] > 1) {
--hash[s[i]];
++i;
}
if (j - i + 1 > max) {
max = j - i + 1;
}
}
System.out.println(max);
}
}