树状数组
把nums2中的元素对应的坐标存到一个哈希表中,然后枚举nums1中的元素,如果当前枚举的元素为a,找到a在nums2中的下标idx,然后在树状数组中查找idx之前有l个数出现过,在idx之后有r个数没出现过,则以a为三元组中间那个元素的三元组的个数有l*r个,累加到答案中去,然后把idx加到树状数组中,继续往后枚举nums1中的元素。
class Solution {
public:
long long ans=0;
int tr[100010];
int n;
int lowbit(int x){
return x&-x;
}
void add(int u,int k){
for(int i=u;i<=n;i+=lowbit(i)) tr[i]+=k;
}
int query(int u){
int res=0;
for(int i=u;i;i-=lowbit(i)){
res+=tr[i];
}
return res;
}
long long goodTriplets(vector<int>& nums1, vector<int>& nums2) {
n=nums1.size();
int mp[n+1];
for(int i=0;i<n;i++) mp[nums2[i]]=i+1;
for(int i=0;i<n;i++){
int l=query(mp[nums1[i]]);
int r=(n-mp[nums1[i]])-query(n)+l;
ans+=1LL*l*r;
add(mp[nums1[i]],1);
}
return ans;
}
};
时间复杂度:O(nlogn)
空间复杂度:O(n)