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

最长无重复子数组

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 ;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务