給定一個數組arr,返回arr的最長無重復元素子數組的長度,無重復指的是所有數字都不相同。
子數組是連續的,比如[1,3,5,7,9]的子數組有[1,3],[3,5,7]等等,但是[1,3,7]不是子數組
牛客網:NC41 最長無重復子數組
官方示例
示例1
輸入
[2,3,4,5]
輸出
4
示例2
輸入
[2,2,3,4,3]
輸出
3
示例3
輸入
[9]
輸出
1
示例4
輸入
[2,2,3,4,8,99,3]
輸出
5
實例6
輸入
[1, 2, 3, 4, 4, 3, 3, 1, 2, 3, 4, 3, 1, 7, 6, 2, 1]
輸出
6
說明:其中最長重復元素為[4, 3, 1, 7, 6, 2]
解題思路
這道題使用兩個指針來實現,其中,左指針start和右指針end為0,開始時,做執政第一個數半段hash表里面是否有重復的值,沒有將數字加入,以此類推。若存在,此時記錄下表的長度,然后從右邊開始移除start指向的元素,start自增,一直到待加入元素不為重復為止,這樣就可以找出無重復的子數組列表長度了。
代碼實現
public int maxLength(int[] arr) {
int res = 0;
int start = 0;
int end = 0;
Map<Integer, Integer> map = new HashMap<>();
while (end < arr.length) {
// 若不存在,添加元素
if (!map.containsKey(arr[end])) {
map.put(arr[end], 1);
end++;
} else {
// 首先獲取列表長度,然后用res保留最大值
if (res < end - start) {
res = end - start;
}
//移除待添加元素直到沒有重復元素為止
while (map.containsKey(arr[end])) {
map.remove(arr[start]);
start++;
}
}
}
return Math.max(res, end - start);
}