Welcome to Subscribe On Youtube
2032. Two Out of Three
Description
Given three integer arrays nums1
, nums2
, and nums3
, return a distinct array containing all the values that are present in at least two out of the three arrays. You may return the values in any order.
Example 1:
Input: nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3] Output: [3,2] Explanation: The values that are present in at least two arrays are: - 3, in all three arrays. - 2, in nums1 and nums2.
Example 2:
Input: nums1 = [3,1], nums2 = [2,3], nums3 = [1,2] Output: [2,3,1] Explanation: The values that are present in at least two arrays are: - 2, in nums2 and nums3. - 3, in nums1 and nums2. - 1, in nums1 and nums3.
Example 3:
Input: nums1 = [1,2,2], nums2 = [4,3,3], nums3 = [5] Output: [] Explanation: No value is present in at least two arrays.
Constraints:
1 <= nums1.length, nums2.length, nums3.length <= 100
1 <= nums1[i], nums2[j], nums3[k] <= 100
Solutions
Solution 1: Array + Enumeration
We can first put each element of the arrays into an array, then enumerate each number $i$ from $1$ to $100$, and check whether $i$ appears in at least two arrays. If so, add $i$ to the answer array.
The time complexity is $O(n_1 + n_2 + n_3)$, and the space complexity is $O(n_1 + n_2 + n_3)$. Here, $n_1, n_2, n_3$ are the lengths of the arrays nums1
, nums2
, and nums3
, respectively.
-
class Solution { public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) { int[] s1 = get(nums1), s2 = get(nums2), s3 = get(nums3); List<Integer> ans = new ArrayList<>(); for (int i = 1; i <= 100; ++i) { if (s1[i] + s2[i] + s3[i] > 1) { ans.add(i); } } return ans; } private int[] get(int[] nums) { int[] s = new int[101]; for (int num : nums) { s[num] = 1; } return s; } }
-
class Solution { public: vector<int> twoOutOfThree(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3) { auto get = [](vector<int>& nums) { vector<int> cnt(101); for (int& v : nums) cnt[v] = 1; return cnt; }; auto s1 = get(nums1), s2 = get(nums2), s3 = get(nums3); vector<int> ans; for (int i = 1; i <= 100; ++i) { if (s1[i] + s2[i] + s3[i] > 1) { ans.emplace_back(i); } } return ans; } };
-
class Solution: def twoOutOfThree( self, nums1: List[int], nums2: List[int], nums3: List[int] ) -> List[int]: s1, s2, s3 = set(nums1), set(nums2), set(nums3) return [i for i in range(1, 101) if (i in s1) + (i in s2) + (i in s3) > 1]
-
func twoOutOfThree(nums1 []int, nums2 []int, nums3 []int) (ans []int) { get := func(nums []int) (s [101]int) { for _, v := range nums { s[v] = 1 } return } s1, s2, s3 := get(nums1), get(nums2), get(nums3) for i := 1; i <= 100; i++ { if s1[i]+s2[i]+s3[i] > 1 { ans = append(ans, i) } } return }
-
function twoOutOfThree(nums1: number[], nums2: number[], nums3: number[]): number[] { const count = new Array(101).fill(0); new Set(nums1).forEach(v => count[v]++); new Set(nums2).forEach(v => count[v]++); new Set(nums3).forEach(v => count[v]++); const ans = []; count.forEach((v, i) => { if (v >= 2) { ans.push(i); } }); return ans; }
-
use std::collections::HashSet; impl Solution { pub fn two_out_of_three(nums1: Vec<i32>, nums2: Vec<i32>, nums3: Vec<i32>) -> Vec<i32> { let mut count = vec![0; 101]; nums1 .into_iter() .collect::<HashSet<i32>>() .iter() .for_each(|&v| { count[v as usize] += 1; }); nums2 .into_iter() .collect::<HashSet<i32>>() .iter() .for_each(|&v| { count[v as usize] += 1; }); nums3 .into_iter() .collect::<HashSet<i32>>() .iter() .for_each(|&v| { count[v as usize] += 1; }); let mut ans = Vec::new(); count .iter() .enumerate() .for_each(|(i, v)| { if *v >= 2 { ans.push(i as i32); } }); ans } }