class Solution {
public:
vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) {
}
};
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
原站题解
python3 解法, 执行用时: 44 ms, 内存消耗: 15 MB, 提交时间: 2022-12-29 10:10:08
class Solution: def twoOutOfThree(self, nums1: List[int], nums2: List[int], nums3: List[int]) -> List[int]: mask = defaultdict(int) for i, nums in enumerate((nums1, nums2, nums3)): for x in nums: mask[x] |= 1 << i # 用3位进制标记数字在各个数组出现情况 return [x for x, m in mask.items() if m & (m - 1)]
golang 解法, 执行用时: 12 ms, 内存消耗: 4.8 MB, 提交时间: 2022-12-29 10:08:18
func twoOutOfThree(nums1, nums2, nums3 []int) (ans []int) { mask := map[int]int{} for i, nums := range [][]int{nums1, nums2, nums3} { for _, x := range nums { mask[x] |= 1 << i } } for x, m := range mask { if m&(m-1) > 0 { ans = append(ans, x) } } return }
javascript 解法, 执行用时: 76 ms, 内存消耗: 44.9 MB, 提交时间: 2022-12-29 10:08:05
/** * @param {number[]} nums1 * @param {number[]} nums2 * @param {number[]} nums3 * @return {number[]} */ var twoOutOfThree = function(nums1, nums2, nums3) { const map = new Map(); for (const i of nums1) { map.set(i, 1); } for (const i of nums2) { map.set(i, (map.get(i) || 0) | 2); } for (const i of nums3) { map.set(i, (map.get(i) || 0) | 4); } const res = []; for (const [k, v] of map.entries()) { if ((v & (v - 1)) !== 0) { res.push(k); } } return res; };
java 解法, 执行用时: 4 ms, 内存消耗: 41.9 MB, 提交时间: 2022-12-29 10:07:50
class Solution { public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i : nums1) { map.put(i, 1); } for (int i : nums2) { map.put(i, map.getOrDefault(i, 0) | 2); } for (int i : nums3) { map.put(i, map.getOrDefault(i, 0) | 4); } List<Integer> res = new ArrayList<Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { int k = entry.getKey(), v = entry.getValue(); if ((v & (v - 1)) != 0) { res.add(k); } } return res; } }
cpp 解法, 执行用时: 16 ms, 内存消耗: 25.8 MB, 提交时间: 2022-12-29 10:06:12
class Solution { public: vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) { unordered_map<int, int> mp; for (auto& i : nums1) { mp[i] = 1; } for (auto& i : nums2) { mp[i] |= 2; } for (auto& i : nums3) { mp[i] |= 4; } vector<int> res; for (auto& [k, v] : mp) { if (v & (v - 1)) { res.push_back(k); } } return res; } };
python3 解法, 执行用时: 48 ms, 内存消耗: 14.9 MB, 提交时间: 2022-05-30 15:21:41
class Solution: def twoOutOfThree(self, nums1: List[int], nums2: List[int], nums3: List[int]) -> List[int]: t1, t2, t3 = [k for k in nums1 if k in nums2], [k for k in nums1 if k in nums3], [k for k in nums2 if k in nums3] return list(set(t1+t2+t3))