T2 - 数组片段匹配
注意题目中标注要求满足条件的长度相同的子数组中,只需要 存在\bf{存在}存在 数对 p(xi,yi)(1≤i≤k)p(x_i, y_i) (1 \le i \le k)p(xi ,yi )(1≤i≤k) 其中 xi=yix_i = y_ixi =yi 即可。
这点提示我们要关注相同的元素。那么对于两个相同的元素,各自形成的子数组,如果两者在原数组中距离较远,则包含其子数组长度越短,反之,包含其子数组的长度越长。
在原数组中令 ai=bj(1≤i<j≤n)a_i = b_j(1 \le i < j \le n)ai =bj (1≤i<j≤n) 这个长度可以拆分成两个部分 xxx 和 yyy,其中 x=ai,y=n−ajx = a_i, y = n - a_jx=ai ,y=n−aj ,那么最终我们要求的答案就是枚举数组中相邻的相同数字的位置 x+yx + yx+y 即 n−(aj−ai)n - (a_j - a_i)n−(aj −ai ) 最大的就是答案。
若数组中没有重复数字,显然不存在满足条件的两个子片段。
AC代码
复杂度分析
代码实现上,遍历数组 aaa,令外使用一个数组 preprepre 记录数字 xxx 在数组中出现的上一个位置,随着遍历不断更新,得到答案。时间复杂度为 O(n)O(n)O(n)。