返回
刷题打卡-滑动窗口
前端
2024-01-02 02:46:05
## 前言
在编写本文之前,我决定先从概念上分析一下滑动窗口算法,以便对算法有个初步的认识。
滑动窗口算法是一种非常实用的算法,可以解决各种各样的问题,如求解最长子串、最大子数组等问题。滑动窗口算法的基本思想是:给定一个数组,在数组中寻找一个连续的子数组,使得这个子数组满足某种条件,如子数组的元素和最大、子数组的元素数量最长等。滑动窗口算法通过在数组中移动一个固定大小的窗口来实现。窗口的大小由算法本身决定,窗口移动时,窗口内的元素也会随之变化。当窗口移动到数组的末尾时,算法就找到了满足条件的子数组。
## 题目一:最大子数组
**题目** :给定一个整数数组,找出其中连续子数组的最大和。
**思路一:暴力解法**
暴力解法的基本思想是:枚举所有可能的子数组,并计算每个子数组的和。最后,选择和最大的子数组作为答案。暴力解法的代码实现如下:
```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;
}
结语
滑动窗口算法是一种非常实用的算法,可以解决各种各样的问题。通过本文的学习,相信大家对滑动窗口算法有了更深入的理解。希望大家在今后的学习和工作中能够灵活运用滑动窗口算法,解决各种实际问题。