题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
import java.util.*; public int maxLength (int[] arr) { // write code here HashMap<Integer, Integer> checked = new HashMap<Integer, Integer>(); int maxLen = 1; int curLen = 0; Integer lastRepeatIndex = 0; for (int i = 0; i < arr.length; i++) { Integer curNum = arr[i]; if (!checked.containsKey(curNum)) { curLen++; } else { //维护了一个最小窗口,lastRepeatIndex是最近一个重复的对象的索引 if (lastRepeatIndex <= checked.get(curNum)) { lastRepeatIndex = checked.get(curNum); } curLen = i - lastRepeatIndex; } maxLen = Math.max(maxLen, curLen); checked.put(curNum, i); } return maxLen; } 逻辑: 0.从数组中取下一个值进行判断: 1. 非重复值,当前数组长度curlen直接++; 2. 重复值:2.1 更新当前最大重复值的索引 2.2 当前值索引-最大重复值索引= 当前无重复数组的长度 3.步骤1或2的长度,与已记录的最大长度进行比较,取大 4.当前值已遍历,所以加入ckecked的map中 注意: 1.when当前值为数组中重复出现的情况,此时curlen=当前索引-最近一次重复值出现的索引,这个值不一定比原来的maxlen小哦,记得要刷新比较下maxlen 比如数组:1,2,3,4,3,2,5,1 当遍历到5时,i=5,非重复值,cur=3+1=4;max=4 继续遍历到i=1时,重复值, 注意此时此时lastRepeatIndex依然指向第一个3,第一个3的索引是2,lastRepeatIndex=2; 重复值1的上一次出现的索引位置是0,lastRepeatIndex(第一个3的索引) 比 第一个1的位置 更考后,不用更新lastRepeatIndex; 当前队列长度= 最新的1的位置-最近重复值3的位置= 5个长度,即cur=5 注意此时,cur已经大于max了,即在重复值的场景下,cur也可能大于max的哈,记得做比较