列表

详情


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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> findThePrefixCommonArray(vector<int>& A, vector<int>& B) { } };

golang 解法, 执行用时: 28 ms, 内存消耗: 6.4 MB, 提交时间: 2023-05-05 16:56:11

func findThePrefixCommonArray(a, b []int) []int {
	ans := make([]int, len(a))
	var p, q uint
	for i, x := range a {
		p |= 1 << x
		q |= 1 << b[i]
		ans[i] = bits.OnesCount(p & q)
	}
	return ans
}

java 解法, 执行用时: 1 ms, 内存消耗: 43.5 MB, 提交时间: 2023-05-05 16:55:58

class Solution {
    public int[] findThePrefixCommonArray(int[] a, int[] b) {
        int n = a.length;
        var ans = new int[n];
        long p = 0, q = 0;
        for (int i = 0; i < n; ++i) {
            p |= 1L << a[i];
            q |= 1L << b[i];
            ans[i] = Long.bitCount(p & q);
        }
        return ans;
    }
}

python3 解法, 执行用时: 68 ms, 内存消耗: 15.9 MB, 提交时间: 2023-05-05 16:55:46

'''
用位运算表示集合,两个数and就代表集合的交集,交集的大小就是二进制中1的个数
'''
class Solution:
    def findThePrefixCommonArray(self, a: List[int], b: List[int]) -> List[int]:
        ans = []
        p = q = 0
        for x, y in zip(a, b):
            p |= 1 << x
            q |= 1 << y
            ans.append((p & q).bit_count())
        return ans

上一题