Java实现滑动窗口算法的示例代码

 更新时间:2025年03月19日 08:45:21   作者:拾荒的小海螺  
滑动窗口算法是一种高效解决子数组、子字符串问题的算法,广泛应用于数据流处理、网络限流和字符串操作等场景,本文将详细解析滑动窗口算法的核心思想、常见问题及其实现方式,需要的朋友可以参考下

1、简述

滑动窗口算法是一种高效解决子数组、子字符串问题的算法,广泛应用于数据流处理、网络限流和字符串操作等场景。本文将详细解析滑动窗口算法的核心思想、常见问题及其实现方式,并结合具体示例和实际应用场景进行说明。

2、核心思想

滑动窗口是一种双指针技术,维护一个能够在数据结构上"滑动"的窗口(通常由两个指针表示)。通过动态调整窗口的范围,优化计算的时间复杂度。

基本步骤:

  • 初始化两个指针 left 和 right,分别表示窗口的左边界和右边界。
  • 移动 right 指针扩大窗口,直到窗口满足问题的条件。
  • 在满足条件时,移动 left 指针缩小窗口,寻找更优解或移除不必要的元素。
  • 重复上述过程,直到 right 遍历完整个数据结构。

3、实践样例

以下是几个经典问题的滑动窗口解法:

3.1 找到字符串中所有不重复字符的最长子串

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

import java.util.HashSet;

public class LongestSubstringWithoutRepeatingChars {
    public int lengthOfLongestSubstring(String s) {
        int left = 0, right = 0, maxLength = 0;
        HashSet<Character> window = new HashSet<>();

        while (right < s.length()) {
            char c = s.charAt(right);
            if (!window.contains(c)) {
                window.add(c);
                maxLength = Math.max(maxLength, right - left + 1);
                right++;
            } else {
                window.remove(s.charAt(left));
                left++;
            }
        }

        return maxLength;
    }

    public static void main(String[] args) {
        LongestSubstringWithoutRepeatingChars solution = new LongestSubstringWithoutRepeatingChars();
        System.out.println(solution.lengthOfLongestSubstring("abcabcbb")); // Output: 3
    }
}

3.2 滑动窗口最大值

给定一个数组 nums 和一个大小为 k 的窗口,找到每个滑动窗口中的最大值。

import java.util.ArrayDeque;
import java.util.Deque;

public class SlidingWindowMaximum {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) return new int[0];
        int n = nums.length;
        int[] result = new int[n - k + 1];
        Deque<Integer> deque = new ArrayDeque<>();

        for (int i = 0; i < nums.length; i++) {
            // 移除窗口左侧已过期的元素
            if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
                deque.pollFirst();
            }

            // 移除所有比当前元素小的元素,因为它们不会成为最大值
            while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }

            deque.offerLast(i);

            // 当窗口达到大小 k 时,记录最大值
            if (i >= k - 1) {
                result[i - k + 1] = nums[deque.peekFirst()];
            }
        }

        return result;
    }

    public static void main(String[] args) {
        SlidingWindowMaximum solution = new SlidingWindowMaximum();
        int[] result = solution.maxSlidingWindow(new int[]{1,3,-1,-3,5,3,6,7}, 3);
        for (int r : result) {
            System.out.print(r + " ");
        }
        // Output: 3 3 5 5 6 7
    }
}

4、应用场景

滑动窗口算法因其高效性,在以下场景中应用广泛:

  • 字符串处理:
    查找字符串中的子串问题,例如最长无重复子串、包含所有指定字符的最短子串。

  • 数据流处理:
    在处理实时数据流时,通过滑动窗口维护最近的状态,例如计算实时统计信息(平均值、最大值等)。

  • 网络限流:
    滑动窗口用于实现动态限流算法,限制一段时间内的请求数量。

  • 数组处理:
    处理固定窗口大小的问题,例如滑动窗口最大值、最小值等。

5、总结

滑动窗口算法通过动态调整窗口范围,极大地提高了求解某些问题的效率。在实际开发中,可以结合问题的特点灵活使用滑动窗口 技术解决各种复杂问题。如果你还没有在项目中尝试滑动窗口算法,那么不妨以本文提供的代码示例为起点,尝试将其应用到实际场景中。

以上就是Java实现滑动窗口算法的示例代码的详细内容,更多关于Java滑动窗口算法的资料请关注脚本之家其它相关文章!

相关文章

  • 解决IDEA无法下载maven依赖的问题

    解决IDEA无法下载maven依赖的问题

    这篇文章主要介绍了解决IDEA无法下载maven依赖的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 使用Swing绘制动态时钟

    使用Swing绘制动态时钟

    这篇文章主要为大家详细介绍了使用Swing绘制动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java中的集合ArrayList类常用方法和遍历

    Java中的集合ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的集合ArrayList类常用方法和遍历,ArrayList 是大小可变的数组的实现,存储在内的数据称为元素,此类提供一些方法来操作内部存储的元素, ArrayList中可不断添加元素,其大小也自动增长,需要的朋友可以参考下
    2024-01-01
  • MyBatis在Spring环境下的事务管理

    MyBatis在Spring环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。这篇文章主要介绍了MyBatis在Spring环境下的事务管理 ,需要的朋友可以参考下
    2019-07-07
  • Spring之借助Redis设计一个简单访问计数器的示例

    Spring之借助Redis设计一个简单访问计数器的示例

    本篇文章主要介绍了Spring之借助Redis设计一个简单访问计数器的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java常见报错类型及解决方案详细解析(从异常处理到错误排查)

    Java常见报错类型及解决方案详细解析(从异常处理到错误排查)

    这篇文章主要介绍了Java常见报错类型及解决方案的相关资料,文中结合具体案例提供针对性解决方案,帮助开发者快速定位并修复问题,需要的朋友可以参考下
    2025-05-05
  • 利用EasyPOI实现多sheet和列数的动态生成

    利用EasyPOI实现多sheet和列数的动态生成

    EasyPoi功能如同名字,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导出,Excel导入等功能,本文主要来讲讲如何利用EasyPOI实现多sheet和列数的动态生成,需要的可以了解下
    2025-03-03
  • 解决 IDEA Maven 项目中"Could not find artifact" 问题的常见情况和解决方案

    解决 IDEA Maven 项目中"Could not find artifact" 

    这篇文章主要介绍了解决IDEA Maven项目中Could not find artifact问题的常见情况和解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • MongoDB支持的java数据类型和测试例子

    MongoDB支持的java数据类型和测试例子

    这篇文章主要介绍了MongoDB支持的java数据类型和测试例子,MongoDB除了本身自有的数据类型外,还为较流行的编程语言定制了该语言的数据类型,需要的朋友可以参考下
    2014-05-05
  • Mybatis实现动态增删改查功能的示例代码

    Mybatis实现动态增删改查功能的示例代码

    这篇文章主要介绍了Mybatis实现动态增删改查功能的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论