笨鸟先飞
1、固定一个元素向后看,遇到重复的终止
2、max记录最大值,Set用来判重
3、leftIndex 用来记录左边的界限

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        //先最笨法实现功能吧  再优化
        if(arr==null) return 0;
        if(arr.length==1) return 1;
        int max = 0;
        Set<Integer> set = new HashSet<Integer>();
        int leftIndex = 0;
        int len = arr.length;
        while(leftIndex<len){
            for(int i=leftIndex;i<len;i++){
                if(set.contains(arr[i])){
                    break;
                }
                set.add(arr[i]);
            }
            max = Math.max(max,set.size());
            set.clear();
            leftIndex++;
        }

        return max;
    }
}

优化版本,性能大幅提高

import java.util.*;


public class Solution {
    /**
     * 上个版本中可优化的思路:遇到重复的元素后,
     * leftIndex要直接跳到重复元素(第1个)的后面
     * 这就需要知道 重复元素的索引,用Set就满足不了了,改用Map<Integer,index>
     * 还有一个优化:如果遇到了 到尾巴都不重复的情况,最大值就产生了,没必要继续了。
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {

        if(arr==null) return 0;
        if(arr.length==1) return 1;
        int max = 0;
        Map<Integer,Integer> map = new HashMap<>();
        int leftIndex = 0;
        int len = arr.length;
        while(leftIndex<len){
            int repeatData = -1;
            for(int i=leftIndex;i<len;i++){
                if(map.keySet().contains(arr[i])){
                    repeatData = arr[i];
                    break;
                }
                map.put(arr[i],i);
            }
            if(repeatData==-1){
                //说明没有遇到重复数据,一直到尾巴,这时就已经产生最大值了,
                //没必要继续了
                return Math.max(max,map.size());
            }else{
                //遇到了重复数据,但还没到尾巴,最大值不确定,需要继续
                //左界限指针直接跳到重复元素(第1个)的后面
                leftIndex = map.get(repeatData)+1;
                max = Math.max(max,map.size());
                map.clear();
            }
        }

        return max;
    }
}