LeetCode每日一题(2023/3/4)


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] < 2^16

解答:二进制枚举

class Solution {
    public int countTriplets(int[] nums) { //定义一个计算三元组数量的函数
        int n=nums.length; //获取数组长度
        int res=0; //定义计数器
        Map<Integer,Integer> map=new HashMap<>(); //使用HashMap存储数字对应出现的次数
        for(int i=0;i<n;i++){ //循环遍历数组,获取第一个数
            for(int j=0;j<n;j++){ //再次循环遍历数组,获取第二个数
                int t=nums[i]&nums[j]; //计算两数的按位与操作
                map.put(t,map.getOrDefault(t,0)+1); //将结果存入HashMap中,并计数
            }
        }
        for(int i=0;i<n;i++){ //再次循环遍历数组,获取第三个数
            for(int a:map.keySet()){ //循环遍历HashMap中所有的键
                if((nums[i]&a)==0) //如果两数的按位与操作结果为0,即这三个数中不存在相同的二进制位
                    res+=map.get(a); //则将该键对应的值加入计数器中
            }
        }
        return res; //返回计数器中的结果
    }
}

  目录