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

127 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 33 天,点击查看活动详情

问题描述

给你三个整数数组 nums1nums2 和 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

思路分析

首先我们要先理解一下题目的意思,题目会给我们三个数组,我们需要构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成,也就是说我们只需要统计每个数字分别出现在多少个不同的数组中即可。我们可以先对给出的每个数组进行去重,然后遍历每个数组,使用哈希表来统计每个数字出现的次数即可。

  • 1、对给出的三个数组进行去重操作

为了避免重复元素对我们的统计产生影响,我们需要先对数组进行去重,这里我们利用Set可以简单快速的完成数组去重操作。

nums1 = [...new Set(nums1)];
nums2 = [...new Set(nums2)];
nums3 = [...new Set(nums3)];
  • 2、统计每个数字出现个次数

遍历三个数组,使用一个哈希表来统计每个字符出现的次数即可,为了避免重复取值,我们只在统计数为2的时候将数字放入结果集。

const map = {}, res = [];
for (const num of nums1) {
    map[num] = 1;
}
for (const num of nums2) {
    map[num] = (map[num] || 0) + 1;
    if (map[num] == 2) res.push(num);
}
for (const num of nums3) {
    map[num] = (map[num] || 0) + 1;
    if (map[num] == 2) res.push(num);
}

AC 代码

完整代码如下:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @param {number[]} nums3
 * @return {number[]}
 */
var twoOutOfThree = function (nums1, nums2, nums3) {
  const map = {}, res = [];
  nums1 = [...new Set(nums1)];
  nums2 = [...new Set(nums2)];
  nums3 = [...new Set(nums3)];
  for (const num of nums1) {
    map[num] = 1;
  }
  for (const num of nums2) {
    map[num] = (map[num] || 0) + 1;
    if (map[num] == 2) res.push(num);
  }
  for (const num of nums3) {
    map[num] = (map[num] || 0) + 1;
    if (map[num] == 2) res.push(num);
  }
  return res;
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。