写在开头:题目来源于牛客网(题目:题目地址),分享自己的解题思路。
题目描述:
需要用到的知识点:数组 + 双指针 + 哈希
代码举例:
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 一直在向右移动(当然也可以不移动),不能从右移向左,让其保持最大值,这一步非常的重要!
爱在结尾:这道题自己刚接触,看来还是要多思考其中的细节,要做到解题的大方向正确,然后再逐步探究其中的细节!