按位与为零的三元组
题目要求
给你一个整数数组 nums ,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:
0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。
题目分析
处理三元组的情况如果直接穷举则会产生过高的时间复杂度O(n3),所以可以先计算两元组结果的分布,用哈希表进行存储,再计算三元组位与为零的情况。
代码演示
class Solution {
public:
int countTriplets(vector<int>& nums) {
int cnt[1<<16]{};
for(auto x:nums){
for(auto y:nums){
cnt[x&y]++;
}
}
int ans=0;
for(auto x:nums){
for(int y=0;y<(1<<16);y++){
if((x&y)==0){
ans+=cnt[y];
}
}
}
return ans;
}
};