最长无重复子序列
描述
给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
解题
Solution1
/**
* 最长无重复子数组
* 哈希表 指针遍历
*/
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int maxlength(int[] arr){
if (arr.length==0) return 0;
Map<Integer,Integer> map = new HashMap<>();//哈希表 键为数组元素 值为数组下标
int max =0;
for (int i = 0,j=0; i <arr.length ; i++) {
if (map.containsKey(arr[i])){
j=Math.max(j,map.get(arr[i])+1);//若发生重复,则重新开始计算
}
map.put(arr[i],i);
max=Math.max(max,i-j+1);//取最大子序列
}
return max;
}
}
Solution2
/**
* 最长无重复子序列
* 队列 集合
*/
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class Solution2 {
public int maxLength(int[] arr){
if (arr.length==0) return 0;
Queue<Integer> queue = new LinkedList();//创建队列
int max=0;
for (int i:arr){
while (queue.contains(i)){
queue.poll();//出队
}
queue.add(i);
max=Math.max(max,queue.size());
}
return max;
}
public int maxLength2(int[] arr){
if (arr.length==0) return 0;
Set<Integer>set = new HashSet<>();//创建集合
int left=0,right=0;//双指针
int max=0;
while (right<arr.length){
while (set.contains(arr[right])){
set.remove(arr[left++]);
}
set.add(arr[right++]);
max=Math.max(max,right-left);
}
return max;
}
public int maxLength3(int[] arr){
if (arr.length==0) return 0;
Set<Integer>set = new HashSet<>();//创建集合
int left=0,right=0;//双指针
int max=0;
while (right<arr.length){
if (set.contains(arr[right])){
set.remove(arr[left++]);
}else{
set.add(arr[right++]);
max=Math.max(max,set.size());
}
}
return max;
}
}