Giả sử chúng ta có một mảng các số nguyên A. Chúng ta phải tìm số bộ ba chỉ số (i, j, k) sao cho -
-
0 <=i
-
0 <=j
-
0 <=k
A [i] AND A [j] AND A [k] là 0, trong đó AND đại diện cho toán tử AND bit.
Vì vậy, nếu đầu vào là [3,1,2], thì đầu ra sẽ là 12
-
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một bản đồ m
-
ret:=0
-
n:=kích thước của A
-
để khởi tạo i:=0, khi i
-
để khởi tạo j:=0, khi j
-
để khởi tạo j:=0, khi j
-
-
-
để khởi tạo i:=0, khi i
-
x:=A [i]
-
cho tất cả các cặp khóa-giá trị a trong m
-
nếu (a.key AND x) giống 0, thì -
-
ret:=ret + a.value
-
-
-
-
trả lại ret
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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)); }
Đầu vào
{3,1,2}
Đầu ra
12