题解 | #最长无重复子数组#

最长无重复子数组

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的哈,记得做比较
  

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务