【优选算法必刷100题】第038题(位运算):消失的两个数字

【优选算法必刷100题】第038题(位运算):消失的两个数字

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

🌟心向往之行必能至


🎥Cx330🌸的简介:


目录

前言:

38. 消失的两个数字

算法原理(位运算):

思路:

位运算解法代码(C++):

代码一:位图

代码二:异或

博主手记(字体还请见谅哈):

总结:


前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

位运算专题


38. 消失的两个数字

题目链接:

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

题目描述:

题目示例:

算法原理(位运算):
思路:

本题就是 268.丢失的数字+260.只出现一次的数字||| 组合起来的题。
先将数组中的数和【1,n+2】区间内的所有数【异或】在一起,问题就变成了:有两个数出现了【一次】,其余所有的数出现了【两次】。进而变成了 260.只出现了一次的数字||| 这道题

位运算解法代码(C++):
代码一:位图
class Solution { public: vector<int> missingTwo(vector<int>& nums) { //将所有数异或在一起 int ret=0; for(auto x:nums) ret^=x; for(int i=1;i<=nums.size()+2;i++) ret^=i; //找出a,b比特位不同的那一位 int differ=0; while(1) { if(((ret>>differ)&1)==1) break; else differ++; } //根据differ位不同将所有数划分为两大类 int a=0,b=0; for(auto x:nums) if(((x>>differ)&1)==1) b^=x; else a^=x; for(int i=1;i<=nums.size()+2;i++) if(((i>>differ)&1)==1) b^=i; else a^=i; return {a,b}; } };
代码二:异或
class Solution { public: vector<int> missingTwo(vector<int>& nums) { int temp=0; for(auto& x:nums) temp^=x; for(int i=1;i<=nums.size()+2;i++) temp^=i; //现在temp中剩下的是a^b,那么一定至少有一位是1,我们就提取最后一位 int ls=temp&(-temp); int a=0,b=0; for(auto&x:nums) { if(x&ls) a^=x; else b^=x; } for(int i=1;i<=nums.size()+2;i++) { if(i&ls) a^=i; else b^=i; } return {a,b}; } }; 

博主手记(字体还请见谅哈):


总结:

结语:本文介绍了使用位运算解决&quot;消失的两个数字&quot;问题的两种方法。问题可转化为找出两个只出现一次的数字。方法一通过异或所有数后找出差异位,将数字分为两类分别异或;方法二利用异或结果的最低位1作为区分标准。两种方法都实现了O(n)时间复杂度和O(1)空间复杂度的解决方案,适用于处理大规模数据

Read more

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

文章目录 * 模板 * 算法原理 * 代码编写 * 1. 第 N 个泰波那契数 * 题目解析 * 算法思路 * 代码编写 * 空间优化 * 2. 三步问题 * 题目解析 * 算法原理 * 代码编写 * 3 . 使用最小花费爬楼梯 * 题目解析 * 算法原理 * 解法一 * 解法二 * 代码编写 模板 算法原理 * 做动态规划的题目,一般会先创建一个一维数组 dp,称之为 dp表 * 我们想办法填满这个 dp表,里面的某个值就是最终结果 采用动态规划,一般分五步: 1. 状态表示 1. 是什么? * dp 表中每一个值所表示的含义就是状态表示(通俗解释) 2. 怎么来?(非常重要) * 题目要求 * 经验+题目要求(多做题)

By Ne0inhk
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型

【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型

本篇博客给大家带来的是简单多状态之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 * 要开心 * 要快乐 * 顺便进步 * * * * 1. 按摩师 * 2. 打家劫舍 * 3. 删除并获得点数 * 4. 粉刷房子 * * * 要开心 要快乐 顺便进步 1. 按摩师 题目链接:面试题 17.16. 按摩师 题目内容: 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。 注意:本题相对原题稍作改动 示例 1: 输入: [1,

By Ne0inhk
【优选算法】(实战体验滑动窗口的奇妙之旅)

【优选算法】(实战体验滑动窗口的奇妙之旅)

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法》《C++知识内容》《Linux系统知识》《算法刷题指南》《测评文章活动推广》 ✨逆境不吐心中苦,顺境不忘来时路!✨🎬 博主简介: 在算法的世界里,“高效"永远是不变的追求,而优选算法的核心,就是在纷繁复杂的解题思路中,找到最简洁、最高效的解决方案.当我们面对数组、字符串的子区间问题时,常常会陷入暴力枚举的困境—双重循环带来的O(n²)时间复杂度,不仅会让代码运行效率低下,更会在数据量激增时陷入超时的僵局,成为算法进阶路上的"绊脚石”.而滑动窗口算法,正是破解这类问题的"神奇钥匙",它以其独特的动态窗口思想,将看似复杂的问题化繁为简,轻松实现时间复杂度从O(n²)到O(n)的跨越式优化,成为优选算法体系中不可或缺的核心工具之一.它就像一个可灵活移动的"观察框",通过双指针维护窗口的左右边界,

By Ne0inhk