一、题目
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。

二、实现
使用双指针
我们使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到map中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置,我们就以pwwkew(这是之前画的图,求的是字符串,不是数字,这里就拿来用了,原理都是一样的)为例画个图看一下
注意:map集合中不允许有重复的key值,如果存入的key值重复,则会覆盖之前的key值
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
if(arr.length == 0){
return 0;
}
// 1.存放以遍历的元素(键:元素值,值:该元素所对应的下标)
// 便于判断重复字符出现的位置,以更新下标
HashMap<Integer,Integer> map = new HashMap<>();
// 2.遍历数组
int res = 0;
for(int start=0,end=0; end<arr.length; end++){
// 2.1 如果arr[end]重复,则更新子序列的开始位置
if(map.containsKey(arr[end])){
// 重复的元素,可能在子序列[start,end]之前,此时start不变
// 重复的元素,可能在子序列[start,end]之间,此时为重复位置+1
start = Math.max(start, map.get(arr[end])+1);
}
// 2.2 将当前访问过的元素加入map集合
map.put(arr[end],end);
// 2.3 更新最大的子序列长度
res = Math.max(res,(end-start+1));
}
return res;
}
}

1071

被折叠的 条评论
为什么被折叠?



