用哈希表存i
, j
, k
他们出现的次数,实现$O(1)$ 查找
一共可以分成三种情况:
①$i == j == k$
②$i == j~ != k$
③$i < k, j < k$ (规定大小顺序,避免重复数)
int threeSumMulti(vector<int>& A, int target) {
//用哈希表来存每个数字出现的次数,实现O(1)的查找
unordered_map<int, long> c;
for (int a : A) c[a] ++; //存次数
long res = 0;
for (auto it : c)
for (auto items2 : c)
{
int i = it.first, j = items2.first, k = target - i - j;
if (!c.count(k)) continue; //如果k没有就跳过(ijk加不到target)
if (i == j && j == k)
res += c[i] * (c[i] - 1) * (c[i] - 2) / 6; //组合数 C(n_3) 因为都相同,所以n个数任选3个带顺序
else if (i == j && j != k)
res += c[i] * (c[i] - 1) / 2 * c[k]; // n个数任选2个 C(n_2) * 剩下一个数k的数量
else if (i < j && j < k)
res += c[i] * c[j] * c[k]; // 一般情况 k大于i,j 保证不会重复数(比如7:{2 4 1}× 而不是数{1 2 4}√)
}
return res % int(1e9 + 7);
}
猪猪在写redis?
没学过唉。。感觉你们都好厉害👍