解题思路:
- 难点在于如何简单的记录位于不同的数组中同一个数并且遍历记录完后如何方便的读取,其实就是哈希表的设计
- 看了题解后恍然大悟,利用二进制的值进行第几数组的记录而不是传统的出现撇为1,很精彩,第几组出现则在二进制的相对位置上变1操作即可,具体操作为:设现在遍历第i个数组的某个数字j,哈希表中的值为mp[j]将其进行:mp[j] |= 2^i,即可完成在对应二进制位上进行+1操作。同时 |= 也保证了在同一数组中即使出现了2次以上,几多次重复该操作也不会影响。
- 对于最后根据这个二级制数如何判断是否出现2次以上也很巧妙采用了x&(x-1)这个公式的作用是将x的二进制的最右边的一个1变为0,例如10010100进行该操作后变成10010000,所以只有在经历过一个该操作后依旧大于0则说明至少在两个数组中出现过。则可以放入答案列表。
代码:
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;
}
};