数组中两个相似元素之间的最大长度

时间:2019-04-09 09:54:38

标签: c++

如何找到数组中两个相似元素之间的最大长度?

{6, 6, 4, 2, 3, 6, 1, 2, 3, 4, 5, 6, 5, 4}

此数组中两个6之间的最大长度  是{1, 2, 3, 4, 5}不是{4, 2, 3}

1 个答案:

答案 0 :(得分:0)

您的问题陈述是查找仅包含唯一元素的子数组的最大长度。

如果您从i ... j中选择一个范围,并且如果子数组没有重复项,则更新最大长度,这显然可以在O(n * n)中完成。

max_len = 0
for(int i = 0; i < n; ++i) 
    for(int j = 0; j <= i; ++j) 
        max_len = max( len(arr[i ... j] ), max_len) if arr[i ... j] has unique elements

我们可以通过存储每个数字的最后一次出现并基于其找到距离来优化上述代码。

int find_max_length(vector<int> arr) {
        map<int, int> last_occ; //store the last occurance of each number
        int n = arr.size();

        //initialize last occurance as -1
        for(int i = 0; i < n; ++i) 
            last_occ[arr[i] ] = -1;

        //store the starting position of the subarray that has unique numbers
        int unique_pos = 0, max_length = 1;

        for(int i = 0; i < n; ++i) {
            if(last_occ[arr[i] ] != -1) // the number can't be a part of the subarray since a copy of it exists. Trackback subarray
                unique_pos = last_occ[arr[i] ] + 1;

            //all elements from unique_pos to the current index will be unique
            max_length = max(max_length, i - unique_pos + 1);
            last_occ[arr[i] ] = i;  
        }

    return max_length; 
}

您可以通过稍作修改使程序返回索引范围并打印max_length中的数字。

由于从map提取的日志为log n,因此该代码在O(n)* log(n)中运行