给你一个整数数组 nums ,返回其中 按位与三元组 的数目。
按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:
0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。
nums = [2,1,3]
nums = [0,0,0]
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
27
数据范围不大, 但肯定不能纯暴力的枚举三元组,但可以类似使用两数之和的优化技巧,优化时间复杂度。就感觉很微妙。不知如何形容。
// 这次代码好有意思,写的和python似的。
class Solution {public int countTriplets(int[] nums) {int[] cnt = new int[1 << 16];for(int x : nums)for(int y : nums)cnt[x & y]++;int ans = 0;for(int x : nums)for(int y = 0; y < (1 << 16); y++)// (x & y)一定得加括号if((x & y) == 0) ans += cnt[y];return ans;}
}