最朴素的想法,用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]每个元素的下标。
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;
}
};