「每日LeetCode」2022年12月29日

本文最后更新于:2023年3月19日 晚上

  1. 至少在两个数组中出现的值

2032. 至少在两个数组中出现的值

给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少两个 数组中出现的所有值组成数组中的元素可以按 任意 顺序排列。

示例 1:
输入:nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3] 输出:[3,2] 解释:至少在两个数组中出现的所有值为: - 3 ,在全部三个数组中都出现过。 - 2 ,在数组 nums1 和 nums2 中出现过。
示例 2:
输入:nums1 = [3,1], nums2 = [2,3], nums3 = [1,2] 输出:[2,3,1] 解释:至少在两个数组中出现的所有值为: - 2 ,在数组 nums2 和 nums3 中出现过。 - 3 ,在数组 nums1 和 nums2 中出现过。 - 1 ,在数组 nums1 和 nums3 中出现过。
示例 3:
输入:nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5] 输出:[] 解释:不存在至少在两个数组中出现的值。

提示:

  • 1 <= nums1.length, nums2.length, nums3.length <= 100
  • 1 <= nums1[i], nums2[j], nums3[k] <= 100

思路

建立三个集合。遍历集合一,判断集合二或集合三种是否有这个数,有的话加入结果集合,并删除对应集合里的值,避免重复判断。12/13/23 三种组合方式都判断一次即可。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @return {number[]}
*/
var twoOutOfThree = function (nums1, nums2, nums3) {
const set1 = new Set(nums1),
set2 = new Set(nums2),
set3 = new Set(nums3);
const res = new Set();
for (const num of set1) {
if (set2.has(num)) {
res.add(num);
set2.delete(num);
}
if (set3.has(num)) {
res.add(num);
set3.delete(num);
}
}
for (const num of set2) {
if (set3.has(num)) {
res.add(num);
set3.delete(num);
}
}
return [...res.values()];
};