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

给你两个下标从 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 <= 50
  • 1 <= 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;
    }
};
相关推荐
文丑颜不良啊6 小时前
LeetCode2221~2240题目解析
java·leetcode
Navigator_Z6 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
文丑颜不良啊8 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊10 小时前
LeetCode2141~2160题目解析
java·leetcode
Dream it possible!1 天前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊1 天前
算法之双指针系列(一)
算法·leetcode
Pniubi1 天前
力扣560.和为k的子数组
算法·leetcode·职场和发展
Pniubi1 天前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
文丑颜不良啊1 天前
LeetCode2081~2100题目解析
java·leetcode
文丑颜不良啊1 天前
LeetCode2061~2080题目解析
java·leetcode