
题目描述
给你两个下标从 0 开始的整数数组 nums1
和 nums2
,它们分别含有 n
和 m
个元素。请你计算以下两个数值:
answer1
:使得 nums1[i]
在 nums2
中出现的下标 i
的数量。
answer2
:使得 nums2[i]
在 nums1
中出现的下标 i
的数量。
返回 [answer1, answer2]
。
示例 1:
输入:nums1 = [2,3,2], nums2 = [1,2]
输出:[2,1]
解释:

示例 2:
输入:nums1 = [4,3,2,3,1], nums2 = [2,2,5,2,3,6]
输出:[3,4]
解释:
nums1
中下标在 1,2,3 的元素在 nums2
中也存在。所以 answer1
为 3。
nums2
中下标在 0,1,3,4 的元素在 nums1
中也存在。所以 answer2
为 4。
示例 3:
输入:nums1 = [3,4,2,3], nums2 = [1,5]
输出:[0,0]
解释:
nums1
和 nums2
中没有相同的数字,所以答案是 [0,0]。
提示:
n == nums1.length
m == nums2.length
1 <= n, m <= 100
1 <= nums1[i], nums2[i] <= 100
解法
方法一:哈希表或数组
我们可以用两个哈希表或数组 \(s1\) 和 \(s2\) 分别记录两个数组中出现的元素。
接下来,我们创建一个长度为 \(2\) 的数组 \(ans\),其中 \(ans[0]\) 表示 \(nums1\) 中出现在 \(s2\) 中的元素个数,\(ans[1]\) 表示 \(nums2\) 中出现在 \(s1\) 中的元素个数。
然后,我们遍历数组 \(nums1\) 中的每个元素 \(x\),如果 \(x\) 在 \(s2\) 中出现过,则将 \(ans[0]\) 加一。接着,我们遍历数组 \(nums2\) 中的每个元素 \(x\),如果 \(x\) 在 \(s1\) 中出现过,则将 \(ans[1]\) 加一。
最后,我们返回数组 \(ans\) 即可。
时间复杂度 \(O(n + m)\),空间复杂度 \(O(n + m)\)。其中 \(n\) 和 \(m\) 分别是数组 \(nums1\) 和 \(nums2\) 的长度。
| class Solution:
def findIntersectionValues(self, nums1: List[int], nums2: List[int]) -> List[int]:
s1, s2 = set(nums1), set(nums2)
return [sum(x in s2 for x in nums1), sum(x in s1 for x in nums2)]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | class Solution {
public int[] findIntersectionValues(int[] nums1, int[] nums2) {
int[] s1 = new int[101];
int[] s2 = new int[101];
for (int x : nums1) {
s1[x] = 1;
}
for (int x : nums2) {
s2[x] = 1;
}
int[] ans = new int[2];
for (int x : nums1) {
ans[0] += s2[x];
}
for (int x : nums2) {
ans[1] += s1[x];
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | class Solution {
public:
vector<int> findIntersectionValues(vector<int>& nums1, vector<int>& nums2) {
int s1[101]{};
int s2[101]{};
for (int& x : nums1) {
s1[x] = 1;
}
for (int& x : nums2) {
s2[x] = 1;
}
vector<int> ans(2);
for (int& x : nums1) {
ans[0] += s2[x];
}
for (int& x : nums2) {
ans[1] += s1[x];
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | func findIntersectionValues(nums1 []int, nums2 []int) []int {
s1 := [101]int{}
s2 := [101]int{}
for _, x := range nums1 {
s1[x] = 1
}
for _, x := range nums2 {
s2[x] = 1
}
ans := make([]int, 2)
for _, x := range nums1 {
ans[0] += s2[x]
}
for _, x := range nums2 {
ans[1] += s1[x]
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | function findIntersectionValues(nums1: number[], nums2: number[]): number[] {
const s1: number[] = Array(101).fill(0);
const s2: number[] = Array(101).fill(0);
for (const x of nums1) {
s1[x] = 1;
}
for (const x of nums2) {
s2[x] = 1;
}
const ans: number[] = Array(2).fill(0);
for (const x of nums1) {
ans[0] += s2[x];
}
for (const x of nums2) {
ans[1] += s1[x];
}
return ans;
}
|