笨鸟先飞
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;
}
}
京公网安备 11010502036488号