- 按位与为零的三元组
困难
101
相关企业
给你一个整数数组 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] < 2e16
题解
这个题目是我想太简单了吗。。。。因为最多1000个数字,然后每个数字范围[0,2e16],然后又是做“与”操作,这个题目暴力处理的话,就是1000 x 1000 x 1000的时间复杂度,但因为是“与”操作,如果我们对1000 x 1000的结果去重,会发现最后剩下的数字数目远远小于1e6个,不断做“与”操作最后得到的结果是不断接近0的,所以用个map映射统计下数目,再去暴力找一遍应该就能过。然后就写了个代码测试了下,还真的过了。。。。
AC代码
class Solution {
public:
unordered_map<int,int>count;
int countTriplets(vector<int>& nums)
{
for(int i=0;i<nums.size();i++)
{
for(int j=0;j<nums.size();j++)
{
count[nums[i]&nums[j]] += 1;
}
}
int res = 0;
for(auto iter=count.begin();iter!=count.end();iter++)
{
for(int j=0;j<nums.size();j++)
{
if((iter->first&nums[j])==0)
res += iter->second;
}
}
return res;
}
};