
本文属于「征服LeetCode」系列文章之一这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁本系列将至少持续到刷完所有无锁题之日为止由于LeetCode还在不断地创建新题本系列的终止日期可能是永远。在这一系列刷题文章中我不仅会讲解多种解题思路及其优化还会用多种编程语言实现题解涉及到通用解法时更将归纳总结出相应的算法模板。为了方便在PC上运行调试、分享代码文件我还建立了相关的仓库https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解还可以一同分享给他人。由于本系列文章的内容随时可能发生更新变动欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。给你两个下标从0开始长度为n的整数排列A和B。A和B的前缀公共数组定义为数组C其中C[i]是数组A和B到下标为i之前公共元素的数目。请你返回A和B的前缀公共数组。如果一个长度为n的数组包含1到n的元素恰好一次我们称这个数组是一个长度为n的排列。示例 1输入A[1,3,2,4],B[3,1,2,4]输出[0,2,3,4]解释i0没有公共元素所以C[0]0。 i11和3是两个数组的前缀公共元素所以C[1]2。 i212和3是两个数组的前缀公共元素所以C[2]3。 i3123和4是两个数组的前缀公共元素所以C[3]4。示例 2输入A[2,3,1],B[3,1,2]输出[0,1,3]解释i0没有公共元素所以C[0]0。 i1只有3是公共元素所以C[1]1。 i212和3是两个数组的前缀公共元素所以C[2]3。提示1 A.length B.length n 501 A[i], B[i] n题目保证A和B两个数组都是n个元素的排列。方法 位运算加速求交集用二进制数表示集合两个二进制数的 AND 就是集合的交集二进制数中 1 的个数就是交集的大小。classSolution{publicint[]findThePrefixCommonArray(int[]a,int[]b){longp0,q0;for(inti0;ia.length;i){p|1La[i];q|1Lb[i];a[i]Long.bitCount(pq);}returna;}}classSolution{public:vectorintfindThePrefixCommonArray(vectorinta,vectorintb){uint64_tp0,q0;for(inti0;ia.size();i){p|1ULLa[i];q|1ULLb[i];a[i]popcount(pq);}returna;}};classSolution:deffindThePrefixCommonArray(self,a:List[int],b:List[int])-List[int]:ans[]pq0forx,yinzip(a,b):p|1x q|1y ans.append((pq).bit_count())returnansfuncfindThePrefixCommonArray(a,b[]int)[]int{varp,quintfori,x:rangea{p|1x q|1b[i]a[i]bits.OnesCount(pq)}returna}复杂度分析时间复杂度O ( n ) O(n)O(n)其中n nn是n u m s numsnums的长度。空间复杂度O ( 1 ) O(1)O(1)。返回值不计入。