假设我们有一个整数A的数组。我们必须找到索引(i,j,k)的三元组数,使得-
0 <= i <A的大小
0 <= j <A的大小
0 <= k <A的大小
A [i] AND A [j] AND A [k]为0,其中AND表示按位与运算符。
因此,如果输入类似于[3,1,2],则输出将为12
为了解决这个问题,我们将遵循以下步骤-
定义一张映射
ret:= 0
n:= A的大小
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
对于初始化j:= 0,当j <n时,更新(将j增加1),执行-
对于初始化j:= 0,当j <n时,更新(将j增加1),执行-
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
如果(a.key AND x)等于0,则-
ret:= ret +值
x:= A [i]
对于m中的所有键值对a
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int countTriplets(vector<int>& A){ unordered_map<int, int> m; int ret = 0; int n = A.size(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { m[A[i] & A[j]]++; } } for (int i = 0; i < n; i++) { int x = A[i]; for (auto& a : m) { if ((a.first & x) == 0) { ret += a.second; } } } return ret; } }; main(){ Solution ob; vector<int> v = {3,1,2}; cout << (ob.countTriplets(v)); }
{3,1,2}
输出结果
12