题目链接在这里,题目
题目表述:
描述
给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
示例1,输入:[2,3,4,5],返回值:4
示例2,输入:[2,2,3,4,3],返回值:3
说明:[2,3,4]是最长子数组
示例3,输入:[9],返回值:1
示例4,输入:[1,2,3,1,2,3,2,2],返回值:3
说明:最长子数组为[1,2,3]
这题目看了题解,有好几种解题方法,先来一种吧,有点绕。
思路
使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到map中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置(将j的位置设置为重复元素的下标+1)。
需要注意的点
- 更新 j 值的时候不是j++,而是将 j 放在map.get(arr[i]) + 1处,其中(map.get(arr[i]))指的是重复数字的下标
- 每次都更新一下res,max(res, i - j + 1)
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
// write code here
if(arr.length == 0){
return 0;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int j = 0;
int res = 0;
for(int i = 0; i < arr.length; i++){
if(map.containsKey(arr[i])){
j = Math.max(j, map.get(arr[i]) + 1);
}
map.put(arr[i],i);
res = Math.max(res, i - j + 1);
}
return res;
}
}