常见的滑动窗口(java语言实现)

525 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

滑动窗口,大家应该都不陌生吧,我们今天用Java语言来实现几个常见的滑动窗口题目

  1. 固定窗口

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);
    }
}
  1. 可变窗口

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);
    }


}