按位与和为零的三元组

给你一个整数数组 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;
    }
};
posted @ 2023-07-06 23:17  失控D大白兔  阅读(4)  评论(0编辑  收藏  举报