题目
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
示例:
输入
[2,3,4,5]
返回值
4
分析
最直观的想法就是创建一个窗口,窗口内的值均是不重复的,每当我们要加入一个元素时,我们就要判断这个元素是否与窗口的元素重复,如果没有重复那么右边界扩大一个元素,如果重复我们就要缩小左窗口,直到窗口内的值没有重复的元素为止,那么我们如何记录元素是否出现过纳,显然Map是一个好的选择。
代码
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;
}
//记录元素是否出现过
Map<Integer,Boolean> map = new HashMap();
int left = 0;
int right = 1;
map.put(arr[0],true);
int len = Integer.MIN_VALUE;
while(left<=right && right < arr.length) {
if(map.get(arr[right]) == null) {
map.put(arr[right],true);
right++;
len = Math.max(len,right-left);
} else {
map.remove(arr[left]);
left++;
}
}
return len;
}
}
时间复杂度:o(1)