需要用到的知识点:数组 + 双指针 + 哈希
代码举例:
public class Main { public static void main(String[] args) { int[] arr = new int[]{3,3,2,1,3,3,3,1}; Main main = new Main(); int maxLength = main.maxLength(arr); System.out.println(maxLength); } public int maxLength (int[] arr) { HashMap<Integer,Integer> map = new HashMap(); int res = 0;//返回长度 int left = -1;//左指针 if (arr.length < 2) return arr.length; for (int right = 0; right < arr.length; right++) { if (map.containsKey(arr[right])){ //arr[right]指的是数组index = right的值,如果含有相同的值,则就为true left = Math.max(left,map.get(arr[right])); //map.get(arr[right])得到第一次出现该值的下标,因为这个时候map中还没有放入arr[right]的值,并且要取最靠右边的left } //这个是用来取最长的长度 res = Math.max(res,right - left); //把元素放进map中 map.put(arr[right],right); } return res; } }
输出结果:
自己的思路: HashMap这个API,可以实现对重复key值的过滤,即一个key只能有一个value。看完上述代码的注释,基本都能理解每一步的含义,但是自己看完别人的代码后,尝试着自己写,出现了一个很重要的问题:
第一次把left = Math.max(left,map.get(arr[right]));,写成了left = map.get(arr[right]);,用牛客网的测试发现没有错误,但是当提交代码的时候就出现了报错,报错的例子就是int[] arr = new int[]{3,3,2,1,3,3,3,1};,然后自己debug,发现,要想实现题目要求,就必须让左指针 left 一直在向右移动(当然也可以不移动),不能从右移向左,让其保持最大值,这一步非常的重要!