最長無重復子數組(NC41)


給定一個數組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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM