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;
    }
};
相关推荐
海石11 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石11 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
tachibana21 天前
hot100 排序链表(148)
java·数据结构·算法·leetcode·链表
不能跑的代码不是好代码1 天前
二叉树从基础概念到LeetCode实战
算法·leetcode
凯瑟琳.奥古斯特1 天前
二分查找解力扣1011最优运载能力
开发语言·c++·算法·leetcode·职场和发展
YuK.W2 天前
Leetcode100: 70.爬楼梯、118.杨辉三角、198.打家劫舍
java·算法·leetcode
旖-旎2 天前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
凯瑟琳.奥古斯特2 天前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
凯瑟琳.奥古斯特2 天前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
aqiu1111112 天前
【算法日记 13】LeetCode 49. 字母异位词分组:哈希表的进阶“降维打击”
算法·leetcode·散列表