leetcode 2657. 找到两个数组的前缀公共数组 中等

给你两个下标从 0 开始长度为 n 的整数排列 AB

AB前缀公共数组 定义为数组 C ,其中 C[i] 是数组 AB 到下标为 i 之前公共元素的数目。

请你返回 AB前缀公共数组

如果一个长度为 n 的数组包含 1n 的元素恰好一次,我们称这个数组是一个长度为 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 <= 50
  • 1 <= A[i], B[i] <= n
  • 题目保证 AB 两个数组都是 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;
    }
};
相关推荐
Scabbards_16 分钟前
面试Leetcode - Heap 堆
java·leetcode·面试
ValhallaCoder3 小时前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
青 春 记 忆7 小时前
LeetCode 104. 二叉树的最大深度|Python 解法详解
python·算法·leetcode
evans在进步11 小时前
LeetCode 198:打家劫舍——Java 动态规划详解
java·leetcode·动态规划
Nil20811 小时前
leetcode 234回文链表
算法·leetcode·链表
ZC跨境爬虫12 小时前
LeetCode 119. 杨辉三角 II(原地更新优化详解 + Java Python 实现)
java·python·leetcode
吃着火锅x唱着歌12 小时前
LeetCode 3597.分割字符串
算法·leetcode·职场和发展
Nil2081 天前
leetcode 160相交链表
算法·leetcode·链表
ZC跨境爬虫1 天前
LeetCode 108. 将有序数组转换为二叉搜索树(递归构建详解 + Java Python 实现)
java·python·leetcode
Tisfy1 天前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口