982. Triples with Bitwise AND Equal To Zero
Description
Given an integer array nums, return the number of AND triples.
An AND triple is a triple of indices (i, j, k)
such that:
0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0
, where&
represents the bitwise-AND operator.
Example 1:
Input: nums = [2,1,3] Output: 12 Explanation: We could choose the following i, j, k triples: (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
Example 2:
Input: nums = [0,0,0] Output: 27
Constraints:
1 <= nums.length <= 1000
0 <= nums[i] < 216
Solutions
Solution: Hash Map
- Time complexity: O(n*Max(nums))
- Space complexity: O(Max(nums))
JavaScript
js
/**
* @param {number[]} nums
* @return {number}
*/
const countTriplets = function (nums) {
const maxNum = Math.max(...nums);
const counts = new Array(maxNum + 1).fill(0);
let result = 0;
for (const a of nums) {
for (const b of nums) {
const AND = a & b;
counts[AND] += 1;
}
}
for (const a of nums) {
for (let b = 0; b <= maxNum; b++) {
if (a & b) continue;
result += counts[b];
}
}
return result;
};