题解 | #BM92最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
int maxLen = 0;
HashMap<Integer, Integer> hash = new HashMap<>();
int i = 0, j = 0;
for(; j < arr.length; ++j)
{
if(hash.containsKey(arr[j]))
{
int k = hash.get(arr[j]); // 接下来会把arr[k]删掉
maxLen = (j - i) > maxLen ? (j - i) : maxLen;
while(i <= k)
{
hash.remove(arr[i]);
i++;
}// 出循环后i=k+1
}
hash.put(arr[j], j); // arr[j]仅仅表示试探的元素,一定要加进去
} // 因为之前把arr[k]删了
maxLen = (j - i) > maxLen ? (j - i) : maxLen;
return maxLen;
}
}
// 方法二利用队列
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
int maxLen = 0;
Queue<Integer> q = new LinkedList<>();
for(int i = 0; i < arr.length; ++i)
{
while(q.contains(arr[i])) q.poll(); //把队头到arr[i]这部分删除
q.add(arr[i]); // 重新加上arr[i]
maxLen = Math.max(maxLen, q.size());
}
return maxLen;
}
}
查看10道真题和解析