笨鸟先飞
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; } }