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.length0 <= j < nums.length0 <= k < nums.lengthnums[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 <= 10000 <= nums[i] < 216
Solutions
Solution 1: Enumeration + Counting
First, we enumerate any two numbers x and y, and use a hash table or array cnt to count the occurrences of their bitwise AND result x & y.
Then, we enumerate the bitwise AND result xy, and enumerate z. If xy & z = 0, then we add the value of cnt[xy] to the answer.
Finally, we return the answer.
The time complexity is O(n2 + n × M), and the space complexity is O(M), where n is the length of the array nums; and M is the maximum value in the array nums, with M ≤ 216 in this problem.
PythonJavaC++GoTypeScript
class Solution: def countTriplets(self, nums: List[int]) -> int: cnt = Counter(x & y for x in nums for y in nums) return sum(v for xy, v in cnt.items() for z in nums if xy & z == 0)(code-box)
