目录
滑动窗口算法示例详解(数组:[2,2,3,4,3,5,6])
解题过程:
描述:
给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
数据范围:0≤arr.length≤1050≤arr.length≤105,0<arr[i]≤1050<arr[i]≤105
分析条件:
因为我们要保证子数组是连续的,那么必须利用滑动窗口(双指针实现,左右指针代表的子数组就是滑动窗口),同时要利用HashMap键的唯一性来记录每个元素的长度.
(注意:这道题第一次见比较抽象,参考我给的具体例子看代码)
解题思路:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
//1.创建HashMap,用来记录每个元素出现的次数
HashMap<Integer,Integer> hm = new HashMap<>();
//2.创建一个int类型的数据记录最大长度
int res = 0;
//3.遍历整个arr,left,rigth是滑动窗口的左右边界
for(int left = 0,right = 0;right < arr.length; right++){
//right用来扩展代码,将当前right指针对应的数组元素添加到HashMap中
if(hm.containsKey(arr[right])){
hm.put(arr[right],hm.get(arr[right]) + 1);
}else{
hm.put(arr[right],1);
}
//while循环使窗口无重复元素,窗口左移,直到arr[right]减到1
while(hm.get(arr[right]) > 1){
hm.put(arr[left],hm.get(arr[left]) - 1);
left++;
}
res = Math.max(res,right - left + 1);
}
return res;
}
}
滑动窗口算法示例详解(数组:[2,2,3,4,3,5,6])
让我们逐步分析输入数组 [2,2,3,4,3,5,6]
的处理过程,这将更清晰地展示滑动窗口算法的工作原理。
初始状态
- 数组:
[2,2,3,4,3,5,6]
- 窗口:
left = 0
,right = 0
- 哈希表:
mp = {}
- 结果:
res = 0
详细步骤
步骤 1:right = 0,元素 2
- 窗口:
[2]
- 哈希表:
mp = {2:1}
- 窗口合法(无重复)
- 更新结果:
res = max(0, 0-0+1) = 1
步骤 2:right = 1,元素 2
- 窗口:
[2,2]
- 哈希表:
mp = {2:2}
- 窗口不合法(元素 2 重复)
- 移动左指针:
left = 1
,哈希表更新为mp = {2:1}
- 窗口变为:
[2]
,恢复合法 - 更新结果:
res = max(1, 1-1+1) = 1
步骤 3:right = 2,元素 3
- 窗口:
[2,3]
- 哈希表:
mp = {2:1, 3:1}
- 窗口合法
- 更新结果:
res = max(1, 2-1+1) = 2
步骤 4:right = 3,元素 4
- 窗口:
[2,3,4]
- 哈希表:
mp = {2:1, 3:1, 4:1}
- 窗口合法
- 更新结果:
res = max(2, 3-1+1) = 3
步骤 5:right = 4,元素 3
- 窗口:
[2,3,4,3]
- 哈希表:
mp = {2:1, 3:2, 4:1}
- 窗口不合法(元素 3 重复)
- 移动左指针:
left = 2
,哈希表更新为mp = {2:0, 3:1, 4:1}
- 左指针继续移动:
left = 3
,哈希表更新为mp = {3:1, 4:1}
- 窗口变为:
[3,4,3]
→[4,3]
,恢复合法 - 更新结果:
res = max(3, 4-3+1) = 2
步骤 6:right = 5,元素 5
- 窗口:
[4,3,5]
- 哈希表:
mp = {3:1, 4:1, 5:1}
- 窗口合法
- 更新结果:
res = max(2, 5-3+1) = 3
步骤 7:right = 6,元素 6
- 窗口:
[4,3,5,6]
- 哈希表:
mp = {3:1, 4:1, 5:1, 6:1}
- 窗口合法
- 更新结果:
res = max(3, 6-3+1) = 4
最终结果
- 最长无重复子数组长度:
4
- 对应的子数组:
[4,3,5,6]