【每日一题Day71】LC2032至少在两个数组中出现的值 | 哈希表 + 位运算

简介: 思路:使用一个哈希表记录每个数字在三个数组中的出现情况,哈希表的key值为数值大小,value值为该数字在数组中的出现情况,从左到右第i位为1则表示该数字在第i个数组中出现过。最后根据value值将至少出现在两个数组中的num添加至结果集

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


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.


我还没阳,坚持住!


哈希表+位运算


2022/12/29


  • 思路:使用一个哈希表记录每个数字在三个数组中的出现情况,哈希表的key值为数值大小,value值为该数字在数组中的出现情况,从左到右第i位为1则表示该数字在第i个数组中出现过。最后根据value值将至少出现在两个数组中的num添加至结果集


。如果数字在nums3出现过,那么state大于4证明该数字符合要求

。如果数字在nums3未出现过,那么state大于等于3证明该数字符合要求


  • 实现


class Solution {
    public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) {
        int MAX = 100;
        int[] numToState = new int[MAX + 1];
        List<Integer> res = new ArrayList<>();
        for (int num : nums1){
            numToState[num] |= 1;
        }
        for (int num : nums2){
            numToState[num] |= 1 << 1;
        }
        for (int num : nums3){
            numToState[num] |= 1 << 2;
        }
        for (int i = 0; i <= MAX; i++){
            if (((numToState[i] >> 2) & 1) == 1 && numToState[i] > 4){
                res.add(i);
            }else if (((numToState[i] >> 2) & 1) != 1 && numToState[i] >= 3){
                res.add(i);
            }
        }
        return res;
    }
}


。复杂度分析


  • 时间复杂度:O(n1+n2+n3+C),遍历三个数组各一次,再遍历哈希表
  • 空间复杂度:O(C),哈希表的大小


  • 优化:当value值大于2并且不等于4的时候,就表明key出现了至少两次


class Solution {
    public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) {
        int MAX = 100;
        int[] numToState = new int[MAX + 1];
        List<Integer> res = new ArrayList<>();
        for (int num : nums1){
            numToState[num] |= 1;
        }
        for (int num : nums2){
            numToState[num] |= 1 << 1;
        }
        for (int num : nums3){
            numToState[num] |= 1 << 2;
        }
        for (int i = 0; i <= MAX; i++){
            if (numToState[i] > 2 && numToState[i] != 4){
                res.add(i);
            }
        }
        return res;
    }
}


目录
相关文章
|
6月前
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
50 0
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
|
6月前
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
45 1
|
6月前
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
53 1
|
6月前
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
30 0
|
6月前
|
机器学习/深度学习
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
40 0
|
6月前
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
62 0
|
6月前
|
存储
【每日一题Day158】LC2395和相等的子数组 | 哈希表
【每日一题Day158】LC2395和相等的子数组 | 哈希表
31 0
|
6月前
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
42 0
|
6月前
|
机器学习/深度学习
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
【每日一题Day128】LC2357使数组中所有元素都等于零 | 排序+模拟 哈希表
33 0
|
6月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
30 0