什么时候可以使用滑动窗口?
当我们尝试对一条题目进行暴力插解时,若发现
一、长度最小的子数组
题目链接:. - 力扣(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) {
// 出窗口前先判断是否需要更新maxLength
maxLength = right - left;
}
hashSet.remove(array[left]);// 出窗口
left++;
}
hashSet.add(array[right]);// 进窗口
}
//避免数组一直没有重复值,导致不能进入while循环导致结果错误
if (maxLength < right - left) {
return right - left;
}
return maxLength;
}
}