给你两个下标从 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]
解释:i = 0:没有公共元素,所以 C[0] = 0 。
i = 1:1 和 3 是两个数组的前缀公共元素,所以 C[1] = 2 。
i = 2:1,2 和 3 是两个数组的前缀公共元素,所以 C[2] = 3 。
i = 3:1,2,3 和 4 是两个数组的前缀公共元素,所以 C[3] = 4 。
示例 2:
输入:A = [2,3,1], B = [3,1,2]
输出:[0,1,3]
解释:i = 0:没有公共元素,所以 C[0] = 0 。
i = 1:只有 3 是公共元素,所以 C[1] = 1 。
i = 2:1,2 和 3 是两个数组的前缀公共元素,所以 C[2] = 3 。
提示:
1 <= A.length == B.length == n <= 501 <= A[i], B[i] <= n- 题目保证
A和B两个数组都是n个元素的排列。
分析:由于 A、B 两个数组都是长度为 n 的整数排列,因此每个数组中都包含 1 到 n 的元素恰好一次。用一个 map 记录 Ai 和 Bi 的出现次数,如果 Ai 或者 Bi 出现了 2 次,说明下标 i 之前的公共元素数量增加了 1.
用一个 cnt 记录当前的公共元素数量,初始时 cnt=0. 从 0 开始遍历两个数组,检查是否有哪个数字出现了 2 次,如果有,则 cnt++。之后将 cnt 赋值为公共数组的第 i 个数,最后返回公共数组即可。
cpp
class Solution {
public:
vector<int> findThePrefixCommonArray(vector<int>& A, vector<int>& B) {
vector<int>ans;
int n=A.size(),cnt=0;
map<int,int>mp;
for(int i=0;i<n;++i)
{
mp[A[i]]++,mp[B[i]]++;
if(A[i]==B[i])cnt++;
else
{
if(mp[A[i]]==2)cnt++;
if(mp[B[i]]==2)cnt++;
}
ans.push_back(cnt);
}
return ans;
}
};