返回

刷题打卡-滑动窗口

前端







## 前言

在编写本文之前,我决定先从概念上分析一下滑动窗口算法,以便对算法有个初步的认识。

滑动窗口算法是一种非常实用的算法,可以解决各种各样的问题,如求解最长子串、最大子数组等问题。滑动窗口算法的基本思想是:给定一个数组,在数组中寻找一个连续的子数组,使得这个子数组满足某种条件,如子数组的元素和最大、子数组的元素数量最长等。滑动窗口算法通过在数组中移动一个固定大小的窗口来实现。窗口的大小由算法本身决定,窗口移动时,窗口内的元素也会随之变化。当窗口移动到数组的末尾时,算法就找到了满足条件的子数组。

## 题目一:最大子数组

**题目** :给定一个整数数组,找出其中连续子数组的最大和。

**思路一:暴力解法** 

暴力解法的基本思想是:枚举所有可能的子数组,并计算每个子数组的和。最后,选择和最大的子数组作为答案。暴力解法的代码实现如下:

```java
public static int maxSubArray(int[] nums) {
    int maxSum = Integer.MIN_VALUE;
    for (int i = 0; i < nums.length; i++) {
        int sum = 0;
        for (int j = i; j < nums.length; j++) {
            sum += nums[j];
            maxSum = Math.max(maxSum, sum);
        }
    }
    return maxSum;
}

思路二:滑动窗口解法

滑动窗口解法的基本思想是:使用一个窗口来保存当前的子数组,当窗口移动时,不断更新窗口内的元素。当窗口移动到数组的末尾时,算法就找到了满足条件的子数组。滑动窗口解法的代码实现如下:

public static int maxSubArray(int[] nums) {
    int maxSum = Integer.MIN_VALUE;
    int sum = 0;
    int left = 0;
    int right = 0;
    while (right < nums.length) {
        sum += nums[right];
        maxSum = Math.max(maxSum, sum);
        if (sum < 0) {
            sum = 0;
            left = right + 1;
        }
        right++;
    }
    return maxSum;
}

题目二:最长子串

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

思路一:暴力解法

暴力解法的基本思想是:枚举所有可能的子串,并检查每个子串是否包含重复字符。如果子串不包含重复字符,则将其长度计入答案。暴力解法的代码实现如下:

public static int lengthOfLongestSubstring(String s) {
    int maxLength = 0;
    for (int i = 0; i < s.length(); i++) {
        Set<Character> set = new HashSet<>();
        for (int j = i; j < s.length(); j++) {
            if (set.contains(s.charAt(j))) {
                break;
            } else {
                set.add(s.charAt(j));
                maxLength = Math.max(maxLength, set.size());
            }
        }
    }
    return maxLength;
}

思路二:滑动窗口解法

滑动窗口解法的基本思想是:使用一个窗口来保存当前的子串,当窗口移动时,不断更新窗口内的元素。当窗口移动到数组的末尾时,算法就找到了满足条件的子串。滑动窗口解法的代码实现如下:

public static int lengthOfLongestSubstring(String s) {
    int maxLength = 0;
    int left = 0;
    int right = 0;
    Set<Character> set = new HashSet<>();
    while (right < s.length()) {
        if (set.contains(s.charAt(right))) {
            set.remove(s.charAt(left));
            left++;
        } else {
            set.add(s.charAt(right));
            maxLength = Math.max(maxLength, right - left + 1);
            right++;
        }
    }
    return maxLength;
}

结语

滑动窗口算法是一种非常实用的算法,可以解决各种各样的问题。通过本文的学习,相信大家对滑动窗口算法有了更深入的理解。希望大家在今后的学习和工作中能够灵活运用滑动窗口算法,解决各种实际问题。