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;
    }
};
相关推荐
玖玥拾3 分钟前
LeetCode 27 移除元素
算法·leetcode
hanlin032 小时前
刷题笔记:力扣第704、977、209题(数组相关)
笔记·算法·leetcode
Rabitebla3 小时前
C++ 内存管理全面复习:从内存分布到 operator new/delete
java·c语言·开发语言·c++·算法·leetcode
玖玥拾3 小时前
LeetCode 58 最后一个单词的长度
算法·leetcode
hanlin034 小时前
刷题笔记:力扣第19题-删除链表的倒数第N个结点
笔记·leetcode·链表
菜鸟的升级路4 小时前
C语言栈刷题:LeetCode 20 有效的括号完整解题笔记
c语言·笔记·leetcode
Lsir10110_5 小时前
【力扣hot100】矩阵题通关复盘
算法·leetcode·矩阵
退休倒计时5 小时前
【每日一题】LeetCode 207. 课程表 TypeScript
算法·leetcode·typescript
玖玥拾6 小时前
LeetCode 80 删除有序数组中的重复项 II
算法·leetcode
青山木6 小时前
Hot 100 --- 电话号码的字母组合
java·数据结构·算法·leetcode·逻辑回归