看看这份代码:思路是双指针的同时维护一个unordered_map,当遇到map[a[j]] == m 的时候就说明后面的都是可行解,同时移动前方的指针使得a[i] == a[j],并且更新map的数据,去掉前方的部分数据也是可行解,因此 ret += ( i - before + 1 )*( a.size() - j ) int calulate2(vector<int>& a, int m) { int ret = 0; unordered_map<int, int> map; int before = 0; for (int j = 0; j < a.size(); ++j) { int& num = ++map[a[j]]; if (num < m) continue; else { int i = before; while (a[i] != a[j]) { map[a[i]] --; i++; } num--; ret += ( i - before + 1 )*( a.size() - j ); before = i + 1; } } return ret; }