在C ++中按位加三并等于零
假设我们有一个整数A的数组。我们必须找到索引(i,j,k)的三元组数,使得-
0<=i<A的大小
0<=j<A的大小
0<=k<A的大小
A[i]ANDA[j]ANDA[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.keyANDx)等于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