位运算
algsup
这个作者很懒,什么都没留下…
展开
-
[枚举子集]leetcode1255:得分最高的单词集合(hard)
【代码】[枚举子集]leetcode1255:得分最高的单词集合(hard)原创 2023-02-26 21:14:31 · 217 阅读 · 0 评论 -
[按位与的通用模板]leetcode1521:找到最接近目标值的函数值(hard)
【代码】[按位与的通用模板]leetcode1521:找到最接近目标值的函数值(hard)原创 2022-09-23 16:23:37 · 408 阅读 · 0 评论 -
[子数组按位或的通用模板]leetcode898:子数组按位或操作(medium)
思路:位运算 + 双 hashset。原创 2022-09-23 16:05:13 · 465 阅读 · 0 评论 -
[子数组按位或的通用模板]leetcode2411:按位或最大的最小子数组长度(medium)
思路:位运算 + 集合合并。原创 2022-09-23 15:36:15 · 435 阅读 · 0 评论 -
[位运算]leetcode2401:最长优雅子数组(medium)
对于优雅子数组中各元素两两想与的结果为 0 的话,我们使用 ‘|’ 运算来简化判断。由于优雅子数组各元素想与的结果为 0,因此我们可以使用 ‘|’ 运算来保留这些元素的二进制位,然后与当前元素想与的结果是否为 0 来进行前移。具体实现可参考代码。思路:暴力枚举 + 位运算。原创 2022-09-17 19:03:01 · 789 阅读 · 0 评论 -
[位运算]leetcode477:汉明距离总和(medium)
题目:题解:思路:位运算代码如下:class Solution {public: // 利用乘法原理:在计算汉明距离时,我们只用考虑统一比特位上的值是否相同,而不同比特位之间是互不影响的 // 所以我们只用统计第i位上为1的元素个数c,为0的元素个数n-c,这样第i位的汉明距离为c*(n-c),总共统计32位即可 int totalHammingDistance(vector<int>& a) { int res=0,n=a.原创 2022-05-19 19:00:25 · 161 阅读 · 0 评论 -
[位运算]leetcode2275:按位与结果大于零的最长组合(medium)
题目:题解:思路:hash 表计数,记录32位二进制上位为1的整数个数,整数个数的最大值即为最终答案。代码如下:class Solution {public: // x&y的结果要想大于0,则x y对应的32位二进制数中必定存在某位都是1,这样才能保证相与的结果不为0 // 推广到m个数,只要这m个数对应的32位二进制数某一位上全为1,那么这m个数相与的结果必定不为0, // 所以32位二进制数中每位上为1的整数个数即可,某位1的整数个数的最大值即为正确答原创 2022-05-19 16:54:15 · 222 阅读 · 0 评论 -
[状压dp]leetcode1986:完成任务的最少工作时间段(medium)
题目:题解:思路:状压 dp,枚举子集,学习枚举状态 i 子集的方法。由于 n<=20,可以很方便的使用一个 n 位二进制来表示每个数选与不选。1)预处理 dp 数组,将[0,2^n-1]的所有二进制状态 s 中构成的子集的时间 <= sessionTime 的 dp[s] 初始化为 1。2)进行状态转移方程,即每个状态 s 枚举其子集,更新最小的 dp[s],子集 j 可以从 s 开始枚举,也可以从 s&(s-1) 开始枚举,j 在 s 内的补集为 j ^ s ,然后原创 2022-01-26 21:41:35 · 456 阅读 · 0 评论 -
[二进制枚举]leetcode5992:基于陈述统计最多好人数(hard)
题目:思路:对于这种二进制枚举题,本人始终不得要领,很难受,本次周赛完全手速题,然而这题不会枚举导致g了,难受,多记录这类型题吧。思路:就是将 n 个人作为好人或者坏人,各自枚举一次,也就是 n 个人中某 1 个人作为好人或者坏人,当她作为好人或者坏人时,判断数组中有多少个好人即可。如何判断数组中元素是否为好人呢?当 i 为坏人时,其实不用管,因为他可能说真话也可能说假话,所以只用管 i 为好人时,判断数组中的好人说的话是否产生矛盾了。g[j][k]!=2 时,表示好人说好话或者坏人说原创 2022-01-23 22:43:44 · 461 阅读 · 0 评论 -
[位运算]leetcode201:数字范围按位与(medium)
题目:题解:思路:此题其实就是寻找[m,n]范围内二进制数高位(左边)没有变化的数,后面补上0即为所求的结果。分析1:判断m、n是否相等,如果不相等,m+1会使m的二进制数末位进位,有进位说明m的末位肯定有0的情况,0与任何数相与皆得0,所以结果的末位肯定是0。同理,不断右移1位进行比较,直到最终m=n时,说明找到了[m,n]这个范围内高位没有变化的数,左移相同位数得到的结果就是所求的...原创 2019-12-30 22:40:08 · 240 阅读 · 0 评论 -
[位运算][数学]leetcode342:4的幂(easy)
题目:题解:题解1:数学方法+位运算,为4的幂,那么n也为2的幂,n若为2的幂,那么n&(n-1)=0,否则不为2的幂就为1。题解2:迭代法题解3:递归法相似题型:231. 2的幂326. 3的幂代码如下:class Solution {public: //题解1:数学方法 bool isPowerOfFour_1(int n) { ...原创 2019-12-28 00:55:52 · 196 阅读 · 0 评论 -
[位运算]leetcode231:2的幂(easy)
题目:题解:题解1:除2取余法,若n>1且余数不为0,那么n肯定不是2的幂次方。题解2:位运算,由于2的幂次方表示为二进制只有一位为1,其余位为0,然而负数在计算机表示为二进制的补码(即正数的原码取反+1)。比如8的二进制为00001000,-8的二进制为11111000,所以8&(-8)->00001000 & 11111000 = 00001000,即8...原创 2019-12-28 00:27:47 · 314 阅读 · 0 评论 -
[位运算]leetcode137:只出现一次的数字 Ⅱ (medium)
题目:题解:位运算这题着实很难,菜鸡只想到暴力法,题解2、3的位运算还没读懂,哎,加入收藏了,脑子清醒了,再慢慢看评论区的优秀题解吧。代码如下:class Solution {public: //题解1:暴力法,先排序,然后每三个数寻找是否相等就行了 int singleNumber_1(vector<int>& nums) { ...原创 2019-12-12 16:02:58 · 161 阅读 · 0 评论 -
[位运算][数列求和]leetcode268:缺失数字(easy)
题目:题解:题目大意:数组中的元素为区间[0,n]中的n个元素,不存在重复元素,所以数组中的元素缺失[0,n]中的一个数字。解法1:先将数组进行排序,然后排除边界情况(首元素不为0或尾元素不为数组的大小)后,然后遍历数组判断相邻项是否相差为1即可。解法2:异或。由题意可知,数组的大小为n,数组中的元素为范围[0,n]中的n个数字(缺少一个数字),所以我们直接将原数组与[0,n]范围...原创 2019-10-03 18:16:31 · 246 阅读 · 0 评论 -
[位运算]leetcode190:点到二进制位(easy)
题目:题解:解法1:用字符串保留数字n转换而成的二进制数字,由于数字n转换为二进制数字本身就是用低位到高位的,所以我们直接将转换而成的二进制数字直接添加到字符串尾部就行了,然后将字符串初始化bitset,最后利用函数to_ulong()返回bitset对应的32位无符号小数了。解法2:优化解法1,直接用数字n初始化bitset,然后判断从两端到中间两两相对的位是否相等,若相等,则不需要...原创 2019-10-02 22:51:55 · 190 阅读 · 0 评论 -
[位运算]leetcode371:两数之和(easy)
题目:题解:1)二进制加法存在4种情况:1+1=0(有进位)、1+0=1(无进位)、0+1=1(无进位)、0+0=0(无进位)。仔细一看,若不考虑进位,二进制加法就是两个数异或得到的,所以我们需要将异或之后的结果与进位相加,直到进位为0为止(因为在进位为0时,0与任何数相异或都等于它本身),这样就得到最终结果了。2)进位:因为只有1+1才会产生进位,所以我们将1&1得到的结果左...原创 2019-09-29 09:37:13 · 336 阅读 · 0 评论 -
[位运算]leetcode191:位1的个数(easy)
题目:题解:lass Solution {public: //解法1:C++二进制容器 int hammingWeight_1(uint32_t n) { bitset<32> b(n); return b.count();//返回1的个数 } //解法2:除2取余法 int hammingWei...原创 2019-09-29 16:07:21 · 220 阅读 · 0 评论