给你一个整数数组 nums
,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k)
组成的三元组,并满足下述全部条件:
0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0
,其中&
表示按位与运算符。
示例 1:
输入:nums = [2,1,3] 输出:12 解释:可以选出如下 i, j, k 三元组: (i=0, j=0, k=1) : 2 & 2 & 1 (i=0, j=1, k=0) : 2 & 1 & 2 (i=0, j=1, k=1) : 2 & 1 & 1 (i=0, j=1, k=2) : 2 & 1 & 3 (i=0, j=2, k=1) : 2 & 3 & 1 (i=1, j=0, k=0) : 1 & 2 & 2 (i=1, j=0, k=1) : 1 & 2 & 1 (i=1, j=0, k=2) : 1 & 2 & 3 (i=1, j=1, k=0) : 1 & 1 & 2 (i=1, j=2, k=0) : 1 & 3 & 2 (i=2, j=0, k=1) : 3 & 2 & 1 (i=2, j=1, k=0) : 3 & 1 & 2
示例 2:
输入:nums = [0,0,0] 输出:27
提示:
1 <= nums.length <= 1000
0 <= nums[i] < 216
标签:
['位运算', '数组', '哈希表']难度:Hard
喜欢:48- 先将 每两个元素 进行按与计算,hash 表 记录结果出现次数 ,时间复杂度
$O(n^2)$ - hash 表中的每个键 与
$A[i]$ 进行与 操作,记录 结果为$0$ 的组合数,时间复杂度$O(n^2 * max(A[i]))$
class Solution {
public int countTriplets(int[] nums) {
int n = nums.length;
int res = 0;
int st[] = new int[1<< 16];
for(int i =0; i< n; i++){
for (int j = 0; j< n; j++){
st[nums[i] & nums[j]] ++;
}
}
for (int i=0; i< 1<<16; i++){
for (int k: nums){
if ((i & k) == 0){
res += st[i];
}
}
}
return res;
}
}