intmain(){ scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", a+i); int ans = 0; for (int i = 0, j = 0; i < n; i++) { num[a[i]]++; while (j <= i && num[a[i]] > 1) { num[a[j]]--; j++; } ans = max(ans, i-j+1); } printf("%d\n", ans); return0; }
分析
i 代表右边界,j 代表左边界。
每次循环进入时都将 a[i] 的出现次数增1,如果在 i, j 中间出现了重复的数字,一定是新加入的数字重复,故判断条件是 num[a[i]] > 1。
intmain(){ int n, m, x; scanf("%d%d%d", &n, &m, &x); for (int i = 0; i < n; i++) scanf("%d", A+i); for (int i = 0; i < m; i++) scanf("%d", B+i); for (int i = 0, j=m-1; i < n; i++) { while (A[i] + B[j] >= x) { if (A[i] + B[j] == x) { printf("%d %d", i, j); return0; } j--; } } return0; }
如果你不想要这么多嵌套,可以这样调整。
1 2 3 4 5 6 7
for (int i = 0, j = m-1; i < n; i++) { while (A[i] + B[j] > x) j--; if (A[i] + B[j] == x) { printf("%d %d", i, j); break; } }