什么时候可以使用滑动窗口?
当我们尝试对一条题目进行暴力插解时,若发现
一、长度最小的子数组
题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/2VG8Kg/description/
解题思路:
代码实现:
class Solution {public int minSubArrayLen(int target, int[] nums) {int sum = 0;int minLength = Integer.MAX_VALUE;// 避免干扰,直接设为最大值int n = nums.length;for (int left = 0, right = 0; right < n; right++) {sum += nums[right];// 进窗口while (sum >= target) {//判断if (minLength > right - left + 1) {minLength = right - left + 1;}sum -= nums[left];//出窗口left++;}}return minLength == Integer.MAX_VALUE ? 0 : minLength;}
}
二、无重复字符的最长子串
题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/wtcaE1/
解题思路:
代码实现:
class Solution {public int lengthOfLongestSubstring(String s) {// 先转化为字符数组,方便操作char[] array = s.toCharArray();int maxLength = 0;HashSet<Character> hashSet = new HashSet<>();int left = 0, right = 0;for (; right < array.length; right++) {while (hashSet.contains(array[right])) {if (maxLength < right - left) {// 出窗口前先判断是否需要更新maxLengthmaxLength = right - left;}hashSet.remove(array[left]);// 出窗口left++;}hashSet.add(array[right]);// 进窗口}//避免数组一直没有重复值,导致不能进入while循环导致结果错误if (maxLength < right - left) {return right - left;}return maxLength;}
}