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