给你三个整数数组 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] 输出:[] 解释:不存在至少在两个数组中出现的值。
哈希表
/*
https://leetcode.cn/u/cshappyeveryday/
执行用时:71 ms, 在所有 Typescript 提交中击败了100.00%的用户
内存消耗:52.64 MB, 在所有 Typescript 提交中击败了100.00%的用户
时间复杂度:O(n)
2024年8月26日
*/
function twoOutOfThree2(
nums1: number[],
nums2: number[],
nums3: number[]
): number[] {
const nums2Set = new Set<number>(nums2);
const nums3Set = new Set<number>(nums3);
const res = new Set<number>();
for (const n of nums1) {
if (nums2Set.has(n) || nums3Set.has(n)) {
res.add(n);
}
}
for (const n of nums2) {
if (nums3Set.has(n)) {
res.add(n);
}
}
return [...res];
}
按位运算符
//按位运算符
function twoOutOfThree(
nums1: number[],
nums2: number[],
nums3: number[]
): number[] {
const map = new Map<number, number>();
for (const n of nums1) {
// 1 为 二进制位
map.set(n, 1);
}
for (const n of nums2) {
// 如果在nums1中找到相同的值,则值为 1,而 1 | 2 = 3
// 如果在nums1中没有找到相同的值,则值为 0,而 0 | 2 = 2
map.set(n, (map.get(n) || 0) | 2);
}
for (const n of nums3) {
// 如果在nums1、nums2中找到相同的值,则分三种情况
//情况1 —— 值为 2,而 2 | 4 = 6
//情况2 —— 值为 3,而 3 | 4 = 7
//情况3 —— 值为 1,而 1 | 4 = 5
// 如果在nums1、nums2中没有找到相同的值,则0 | 4 = 4
map.set(n, (map.get(n) || 0) | 4);
}
const res: number[] = [];
// 此时 v 的值可能为[没有匹配的值] 1 , 2 , 4
// [nums2 与 nums1 匹配的值] 3
// [nums2 与 nums3 匹配的值] 6
// [nums1 与 nums3 匹配的值] 5
//[nums1 与 nums2 与 nums3 匹配的值] 7
for (const [k, v] of map) {
//以下分为7种情况
//情况1 v = 1,v-1 = 0, 则 1 & 0 = 0
//情况2 v = 2,v-1 = 1, 则 2 & 1 = 0
//情况3 v = 3,v-1 = 2, 则 3 & 2 = 2
//情况4 v = 4,v-1 = 3, 则 4 & 3 = 0
//情况5 v = 5,v-1 = 4, 则 5 & 4 = 4
//情况6 v = 6,v-1 = 5, 则 6 & 5 = 4
//情况7 v = 7,v-1 = 6, 则 7 & 6 = 6
//只有情况 1,2,4为0,而它们正好处于 [没有匹配的值]
if ((v & (v - 1)) !== 0) {
res.push(k);
}
}
return res;
}