这道题目的基本原理是这样的,设置left和right两个指针,right不停的往右边移动,当遇到和left指针相等的值的时候,需要把left往前移动一个位置,期间每次都计算他们的距离,更新max值。

1, 2, 1, 4, 2, 6, 1, 8, 10

| |
left right

left 和 right模拟一个窗口,窗口随着right的循环,不停的扩大

当right移动第三个数字(也就是1)的时候,发现了和left重复的值,所以left移动到第二个数字(也就是2)。

继续right右移,一直到末尾。

其中踩了一个坑是这样的

  1. 无论这个值是否重复,每一次都要更新map里的位置,比如map里的key等于1的时候,value是0代表1的位置是0.但是遇到第二个1的时候,要及时的更新map的value值为2, 否则你计算长度就会从第一个1开始计算,这就不对了。所以无论是否重复,都要记录数字的位置。

  2. 还有个坑是这样的
    [3,3,2,1,3,3,3,1]

当left滑动到最后一个数字,也就是1的时候,right也是1,这个时候发现窗口内有重复数字1,去取的时候,下标是3,因此程序将左边的指针又挪回了4,这显然是不对的,left的指针是不能后退的,所以要取 max(重复数字位置+1, left). 不能让他后退