链接:
https://leetcode.cn/problems/triples-with-bitwise-and-equal-to-zero/
题意:
给一个数组,给出所有选三个数(数字可以选同一个)的情况中,三个数字按位与等于零的情况数量
解:
暴力是’n^3
,但是n最大是1E3,1E9会爆,但是每个数字最大都是2^16
,按位与计算中数字也不会超过2^16
那就可以优先算任选两个数字组合的情况,然后遍历这个数组和第三个数字,计算最终结果,用时是n^2+2^16*n
(好像和暴力差了10还是100,没想到居然能过)
实际代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int Numax=(1<<16)+3;
int sz[Numax];
int solve(vector<int>& nums)
{
int lg=nums.size();
for(int i=0;i<lg;i++)
{
for(int j=0;j<lg;j++)
{
//cout<<(nums[i]&nums[j])<<endl;
sz[(nums[i]&nums[j])]++;
}
}
int ans=0;
for(int i=0;i<lg;i++)
{
for(int j=0;j<=(1<<16);j++)
{
if(sz[j]&&((j&nums[i])==0))
{
ans+=sz[j];
}
}
}
return ans;
}
int main()
{
int n;cin>>n;
vector<int>nums;
for(int i=1;i<=n;i++)
{
int temp;cin>>temp;
nums.push_back(temp);
}
int ans=solve(nums);
cout<<ans<<endl;
}
限制:
1 <= nums.length <= 1000
0 <= nums[i] < 216