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
        }
    }
    
    

All Problems

All Solutions