// 区间[i, j),j表示下一个将要纳入区间的数的下标 intlongest_repeat(){ int i = 0, j = 1, max = 0; while (j <= n) { if (j - i > max) max = j -i; if (j == n) break; if (nums[i] == nums[j]) j++; else i = j++; } return max; }
// 区间[i, j),j表示下一个将要纳入区间的数的下标 intlongest_non_repeat(){ int i = 0, j = 0, max = 0; while (j <= n) { if (j - i > max) max = j - i; if (j == n) break; int cur = nums[j]; // 如果当前的数cur出现过,则将i移动到cur上次出现的位置的右侧 if (pos[cur] >= i) i = pos[cur] + 1; pos[cur] = j++; } return max; }
intmain(){ memset(pos, -1, sizeof pos); scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &nums[i]); printf("%d", longest_non_repeat()); return0; }