给你一个整数数组 nums ,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:
0 <= i < nums.length0 <= j < nums.length0 <= k < nums.lengthnums[i] & nums[j] & nums[k] == 0,其中&表示按位与运算符。
示例 1:
```txt
输入: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:
```txt
输入:nums = [0,0,0]
输出:27
```
提示:
1 <= nums.length <= 10000 <= nums[i] < 2^16
按位与为零的三元组
题目
给你一个整数数组 nums ,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:
-
0 <= i < nums.length -
0 <= j < nums.length -
0 <= k < nums.length -
nums[i] & nums[j] & nums[k] == 0,其中&表示按位与运算符。
示例 1:
1 | 输入:nums = [2,1,3] |
示例 2:
1 | 输入:nums = [0,0,0] |
提示:
-
1 <= nums.length <= 1000 0 <= nums[i] < 2^16
题解
方法一:
思路
利用nums[i]&nums[j]的值在2^16内。于是可以用哈希表cnt统计nums[i]&nums[j]出现次数。
最后若i & nums[j]为0,则累加cnt[i]作为最后答案。
代码
1 | class Solution { |
方法二:
思路
利用nums[i]&nums[j]的值在2^16内。于是可以用哈希表cnt统计nums[i]&nums[j]出现次数。
枚举nums[i]的补集s的子集sub,累加cnt[sub]即可。
代码
1 | class Solution { |