【算法】位运算算法——消失的两个数字(困难)

题解:消失的两个数字(位运算算法)

目录

1.题目

题目链接:LINK

2.题解

本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历哈希数组 的想法。想要在规定时间/空间复杂度内完成本题,需要借用 位运算算法

具体该如何操作呢?

①首先,我们将 原数组 与 [1,n+2] 的数字全部 异或起来 ,这时候会得出 ret = a ^ b

②根据ret,我们可以知道 a 与 b 的不同的一位二进制 ,我们根据这位不同的二进制来区分a 和 b

③让 原数组[1,n+2] 数字根据不同的这一二进制位 站队 ,再把两队全部异或起来消去相同的一项得出a 和 b,因为a 和 b只在[1,n+2]中出现过一次因而不会被异或掉。

可能单纯叙述有点抽象,我直接用一个例子来说明我上面说的步骤:







3.示例代码如下

cpp 复制代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        int ret = 0;
        for(auto& num : nums) ret ^= num;
        for(int i = 1; i <= nums.size()+2; i++) ret ^= i; 
        
        //ret = a ^ b
        int count = 0;

        while(1)
        {
            if(((ret >> count) & 1) == 1) break;
            else count++;
        }
        
        int a = 0;
        int b = 0;
        for(auto& num: nums) 
        {
            if(((num >> count) & 1) == 1) a ^= num;
            else b^=num;
        }
        for(int i = 0; i <= nums.size()+2; i++)
        {
            if(((i >> count) & 1) == 1) a ^= i;
            else b^=i;
        }
       
        return {a,b};
    }
};

4.总结

这道题整体的思路是这样的,我们先找出ret = a ^ b来,主要是为了确定这俩数字哪个二进制位不一样,方便将其归纳到不同的组中去,两个消失的数字归纳到不同的组之后我们可以用异或的两两相消原理,把重复的数字全部干掉,一组只剩下a,一组只剩下b,返回即可。

拓展:位运算常用操作:LINK


EOF

相关推荐
寻星探路27 分钟前
【前端基础】HTML + CSS + JavaScript 快速入门(三):JS 与 jQuery 实战
java·前端·javascript·css·c++·ai·html
你的冰西瓜44 分钟前
2026春晚魔术揭秘——变魔法为物理
算法
忘梓.1 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(10)
c++·算法·动态规划·代理模式
foolish..1 小时前
动态规划笔记
笔记·算法·动态规划
消失的dk1 小时前
算法---动态规划
算法·动态规划
羑悻的小杀马特1 小时前
【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题
c++·算法·蓝桥杯·动态规划·镜像·洛谷·空隙法
绍兴贝贝1 小时前
代码随想录算法训练营第四十六天|LC647.回文子串|LC516.最长回文子序列|动态规划总结
数据结构·人工智能·python·算法·动态规划·力扣
愚润求学1 小时前
【动态规划】二维的背包问题、似包非包、卡特兰数
c++·算法·leetcode·动态规划
救赎小恶魔1 小时前
C++算法(5)
java·c++·算法
叫我一声阿雷吧1 小时前
【信奥赛基础】动态规划:小学生也能懂的必考算法入门
算法·动态规划