Skip to content

Latest commit

 

History

History
103 lines (79 loc) · 2.54 KB

982.按位与为零的三元组.md

File metadata and controls

103 lines (79 loc) · 2.54 KB

给你一个整数数组 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

算法 1

状态压缩+哈希表 $O(n^2 * max(A[i]))$

  • 先将 每两个元素 进行按与计算,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;
    }
}

参考文献