最朴素的想法,用i做下标遍历数组,对于当前i,用j从i + 1开始遍历数组,当a[i:j-1]子数组中包含a[j](设下标为k)时,说明a[i:j-1]不能更长,此时更新i为k+1。 这样我们可以找到所有子数组和其长,自然可以找到最长子数组。

优化点:判断a[i:j-1]中是否包含a[j],以及如果包含下标是多少。可以在遍历过程中用map保存a[i:j-1]每个元素的下标。

alt

class Solution {
public:
    int maxLength(vector<int>& arr) {
        unordered_map<int, int> indexMap;
        
        int lenMax = 0;
        int i = 0;
        while (i < arr.size())
        {
            indexMap[arr[i]] = i;
            int lenTmp = 1;

            int j = i + 1;
            for (;j < arr.size(); j++)
            {
                if (indexMap.find(arr[j]) != indexMap.end())
                {
                    i = indexMap[arr[j]] + 1;
                    indexMap.clear();
                    break;
                }

                indexMap[arr[j]] = j;
                lenTmp++;
            }

            if (lenTmp > lenMax)
            {
                lenMax = lenTmp;
            }

            if (j == arr.size())
            {
                break;
            }
        }

        return lenMax;
    }
};