Java实现滑动窗口算法的示例代码
作者:拾荒的小海螺
滑动窗口算法是一种高效解决子数组、子字符串问题的算法,广泛应用于数据流处理、网络限流和字符串操作等场景,本文将详细解析滑动窗口算法的核心思想、常见问题及其实现方式,需要的朋友可以参考下
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滑动窗口算法的资料请关注脚本之家其它相关文章!