2657-找到两个数组的前缀公共数组

Raphael Liu Lv10

给你两个下标从 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 个元素的排列。

下午两点【biIibiIi@灵茶山艾府】 直播讲题,记得关注哦~


用位运算表示集合,两个数的 AND 就代表集合的交集,交集的大小就是二进制中 1 的个数。

[sol1-Python3]
1
2
3
4
5
6
7
8
9
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
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
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;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
vector<int> findThePrefixCommonArray(vector<int> &a, vector<int> &b) {
int n = a.size();
vector<int> ans(n);
long long p = 0, q = 0;
for (int i = 0; i < n; ++i) {
p |= 1LL << a[i];
q |= 1LL << b[i];
ans[i] = __builtin_popcountll(p & q);
}
return ans;
}
};
[sol1-Go]
1
2
3
4
5
6
7
8
9
10
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
}

复杂度分析

  • 时间复杂度:\mathcal{O}(n),其中 n 为 nums 的长度。
  • 空间复杂度:\mathcal{O}(1)。仅用到若干额外变量。
 Comments
On this page
2657-找到两个数组的前缀公共数组