题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ /** 思路:利用双指针 left = right = 0; right++直至有window中有重复数组为止。记录当前最大无重复数组 [left,right - 1]; 然后left 找到那个重复的元素 的下一位 再次right++直至有window中有重复数组为止。记录当前最大无重复数组 [left,right - 1]; 然后再次left 找到那个重复的元素 的下一位 ..... 直至right 越界 */ public int maxLength (int[] arr) { // write code here //滑动窗口 分别记录数字和它的下标 HashMap<Integer,Integer> window = new HashMap<>(); //初始化双指针 int left = 0; int right = 0; //记录最长子数组start 和 len 来唯一确定 int len = 1; while(right < arr.length){ if(!window.containsKey(arr[right])){ if(right - left + 1> len){ len = right - left + 1; } }else{ //这里要判断当前的这个数的位置是否还在窗口中 //如果在窗口中 才 +1 不在窗口中 left不变 否则left会移到窗口左边 无法再向右滑动 //例:1 2 3 4 3 2 if(window.get(arr[right]) >= left){ left = window.get(arr[right]) + 1; } //如果重复的数不在窗口中 那么不会影响 len还是照样变大 if(right - left + 1> len){ len = right - left + 1; } } window.put(arr[right],right); right++; } return len ; } }