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

最长无重复子数组

http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        
        HashSet<Integer> set = new HashSet<Integer>();//记录某个时刻窗口内的元素,方便查找(用hashmap也行)
        set.add(arr[0]);//起始时,窗口大小为1,内容为数组首个元素
        
        int l = 0, r = 0, max_subarr_len = 1;//l指向窗口左边界, r指向窗口右边界, max_subarr_len记录最大的窗口值.
        while(r<arr.length-1){
            //根据下一个元素调整窗口大小
            if(!set.contains(arr[r+1])){//下一个元素不在子数组里
                set.add(arr[r+1]);
                r++;//扩大窗口右边界
            }else{//下一个元素已经在子数组里存在
                while(arr[l]!=arr[r+1]){//缩小窗口直到找到重复的元素
                    set.remove(arr[l]);
                    l++;//缩小窗口左边界
                }
                l++;//需要多缩小窗口左边界一次,因为此时l刚好指向重复的元素
                r++;//扩大窗口右边界
            }
            
            //比较并记录窗口大小
            if(r-l+1 >  max_subarr_len){
                 max_subarr_len = r-l+1;
            }
        }
        
        return  max_subarr_len;
    }
}
滑动窗口法:
思路: 
  1. 每次将窗口右侧扩大一个元素, 比较新元素和窗口内存在的其他元素: 若无重复,继续扩大窗口; 若有重复,则将窗口左侧收缩直到重复元素被去除; 
  2. 每次操作完成后比较当前窗口和已知最大窗口大小, 若当前窗口更大则更新最大窗口大小;
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务