难度:β-
用时:0 min
题目:??
这是一道连续区间水题。
就是判重而已。
价值在于它的 map 做法。
用数组 prev 表示前面同值的位置,这样就不用 set。
为什么要用 map?因为是值对位,值可以很大,数组存不下。
在构造 prev 时,要用 map。
下面转紫书代码。
1 for (int i = 0; i < n; i++) { 2 cin >> A[i]; 3 if (!cur.count(A[i])) last[i] = -1; 4 else last[i] = cur[A[i]]; 5 cur[A[i]] = i; 6 }
有 prev 数组以后,在延伸区间的过程中,右端点可以快速更新。
1 while (R < n) { 2 while (R < n && last[R] < L) R++; 3 ans = max(ans, R - L); 4 L++; 5 }
如果用 set,这里就是 log 时间。
另外还有 hash_map 的使用。
1 #include <ext/hash_map> 2 using namespace __gnu_cxx; 3 hash_map<int, int> cur;
用时比普通 map 少一点。
2018-02-05