按位与和为零的三元组
给你一个整数数组 nums ,返回其中按位与和为零三元组的数目。
1. 状态压缩 + 哈希
class Solution {
public:
int countTriplets(vector<int>& nums) {
vector<int> cnt(1 << 16); //记录对应状态值
for (int x: nums) {
for (int y: nums) {
++cnt[x & y];
}
}
int ans = 0;
for (int x: nums) {//遍历当前值
for (int mask = 0; mask < (1 << 16); ++mask) {//遍历所有状态
if ((x & mask) == 0) {
ans += cnt[mask];
}
}
}
return ans;
}
};
2. 直接找满足条件的状态
只需对对应位为零的状态个数求和
class Solution {
public:
int countTriplets(vector<int>& nums) {
vector<int> cnt(1 << 16);
for (int x: nums) {
for (int y: nums) {
++cnt[x & y];
}
}
int ans = 0;
for (int x: nums) { //遍历所有数
x = x ^ 0xffff; //求该数的补集,找对应位为0的数,这里直接枚举补集
for (int sub = x; sub; sub = (sub - 1) & x) {
ans += cnt[sub];
}
ans += cnt[0];
}
return ans;
}
};