982. 按位与为零的三元组
题目描述
给你一个整数数组 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
解法
方法一:枚举 + 计数
我们可以先枚举任意两个数 \(x\) 和 \(y\),用哈希表或数组 \(cnt\) 统计它们的按位与结果 \(x \& y\) 出现的次数。
然后我们枚举 \(x\) 和 \(y\) 的按位与结果 \(xy\),再枚举 \(z\),如果 \(xy \& z = 0\),则将 \(cnt[xy]\) 的值加入答案。
最后返回答案即可。
时间复杂度 \(O(n^2 + n \times M)\),空间复杂度 \(O(M)\),其中 \(n\) 是数组 \(nums\) 的长度;而 \(M\) 是数组 \(nums\) 中的最大值,本题中 \(M \leq 2^{16}\)。
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|