题目概述:
给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
时间限制:1秒 空间限制:256M
算法思路:
本题算法考察的是哈希、双指针、数组;题目要求最长无重复子数组,那么就可用HashMap来存储子数组当中的元素,每次遍历到一个元素后就判断该元素是否出现在Hash当中,如果没有就将该元素存入到当前HashMap当中;为了对原arr数组进行遍历,我采用的是双指针,定义一个slow和一个fast指针;首先slow指向最初索引为0的地方,然后fast从slow开始逐个遍历,直到找到重复元素;然后将slow从上一次的那个开头处前进一位;然后依次fast++,直到fast遍历到arr数组的末尾;
这里需要注意在循环语句当中,当fast指针遍历到数组最末尾后,此时说明又找到一格无重复子数组,需要判断这与之前那个是谁长。
算法实现:
import java.util.*;
import java.util.HashMap;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
// write code here
HashMap<Integer,Integer> hash = new HashMap<>();
int max = 0;
int slow = 0;
int fast = slow;
while (fast!=arr.length){
//System.out.print(1);
if (!hash.containsKey(arr[fast])){
//表示没有重复元素
hash.put(arr[fast],1);
fast++;
//执行到这里如果一直没有重复元素
if(fast==arr.length){
//到最后了
max = Math.max(max,hash.size());
}
}else{
//表示有重复元素
max = Math.max(max,hash.size());
hash.clear();
//相较于之前开头移动一位
slow = slow+1;
fast = slow;
}
}
return max;
}
}