LeetCode 982. Triples with Bitwise AND Equal To Zero
题目链接:https://leetcode.com/problems/triples-with-bitwise-and-equal-to-zero/
题意,已知数组A,长度不超过1000,最大的数不超过$2^{16}$,问存在多少对i,j,k,使得A[i]^A[j]^a[k]=0,i,j,k可以相等。
若直接暴力复杂度为$O(n^3)$,观察到数组不超过$2^{16}$,因此可以先枚举i和j,将结果存储,则结果不超过$2^{17}$,再查找符合的k,复杂度$O(n^2+n*2^{17})$。
class Solution { public: int countTriplets(vector<int>& A) { int ans=0; vector<int> mp(1<<16,0); //存储A[i]*A[j]的个数 for(int i=0;i<A.size();i++) //枚举i和j for(int j=0;j<A.size();j++) mp[A[i]&A[j]]++; for(int i=0;i<A.size();i++) //枚举k for(auto j = 0 ;j<(1<<16); j++){ if((A[i]&j)==0) ans+=mp[j]; else j=j+(A[i]&j)-1; } return ans; } };