按位与为零的三元组[掩码+异或的作用]
创始人
2024-05-28 19:30:15
0

掩码+异或的作用

  • 前言
  • 一、按位与为零的三元组
  • 二、统计分组
    • 1、map统计分组
    • 2、异或+掩码
  • 总结
  • 参考资料

前言

当a + b = 0时,我们能够很清楚的知道b是个什么值,b = 0 - a = -a,如果当a & b = 0时,我们能够很清楚的知道b是什么值吗?

一、按位与为零的三元组

在这里插入图片描述

二、统计分组

1、map统计分组

像这种组合题,纯靠for循环遍历出来的都会超时,一般用map/切片统计,通过乘法/加法,快速组合,或者说抽象的方式组合,只在乎组合的次数,不在乎具体的组合情况。
方法:先两层for循环,进行统计两数与完之后的分组情况,再来两层for循环,来寻找分组数据和第3个数与的情况。

func countTriplets(nums []int) int {// 分组cnt := map[int]int{}for i := 0;i < len(nums);i++ {for j := 0;j < len(nums);j++ {cnt[nums[i] & nums[j]]++}}// 计数ans := 0for k,v := range cnt {if k == 0 {ans += v * len(nums)continue}for _,n := range nums {if n & k == 0 {ans += v}}}return ans
}

2、异或+掩码

上面的解法只是进行了简单的分组,但是并未利用到与操作的特性,我们可以仔细分析与操作的特性,看能不能将第二个双层for循环变成单层for循环。

与操作为0,说明了三个数的每一位,必定有一个0及以上。
假设第一个双层for循环得到了一些数,这些数要和nums再组合一次,当前者的任意一位为1时,后者必须是0,当前者的任意一位为0时,后者可0可1。

可0可1?那怎么记录前者的“相反数”啊?
将一个值整成多份,每份将一个0变1,并记录这种数有一个,这样就不管匹配的什么可0可1了。
我们需要记录所谓的相反数,可通过掩码+异或的方式,来将0变1,1变0,再不断组合1的情况,并记录这些相反数的个数。

func countTriplets(nums []int) int {// 分组统计cnt := make([]int,1 << 16)cnt[0] = len(nums)const MAX = 1 << 16 - 1for i := 0;i < len(nums);i++ {mask := nums[i] ^ MAXfor j := mask;j > 0;j = (j - 1) & mask {cnt[j]++}}// 计数ans := 0for _,a := range nums {for _,b := range nums {ans += cnt[a & b] // 刚好01互补,mask+异或是个好东西}}return ans
}

总结

1)困难题都是各种组件组合而成,所以训练好各种问题的解决方式,再分析困难题的组合情况,就能快速解答困难题。
2)异或的作用蛮大的,配合掩码能将一个数的所有二进制取反。

参考资料

[1] LeetCode 按位与为零的三元组

相关内容

热门资讯

拆迁补贴贪污案,开庭后律师紧急... 文/张家豪律师重庆智豪律师事务所高级合伙人 今天想聊一个很特别的职务犯罪案子,这是一起拆迁补偿领域的...
原创 从... 1854年,清文宗咸丰四年,太平天国的国都天京(今南京)发生了一件震动全国的大事。冬官又正丞相陈宗扬...
香港保监局:就风险为本资本制度... 智通财经获悉,媒体此前报道,香港保监局提议一系列新规,拟引导保险资本流向基础设施等资产,这一举措将把...
库里26+6班凯罗21+12 ... 【搜狐体育战报】北京时间12月23日NBA常规赛,主场作战的勇士以120-97击败魔术。库里26分3...
新日股份5.65亿元合同纠纷二... 12月19日,江苏新日电动车股份有限公司(603787.SH,以下简称“新日股份”)发布诉讼进展公告...
庆阳市预防治理未成年人违法犯罪... 12月22日,市委副书记、市委政法委书记王向阳主持召开全市预防治理未成年人违法犯罪工作推进会议,全面...
大庆法援2025年度成绩单 2025年,大庆市各级法律援助机构在市司法局的领导下,以创新机制激活服务效能,以便民服务打通"最后一...
推进房屋体检制度,确保房子更安... 原标题:工人日报社评丨推进房屋体检制度,确保房子更安全更宜居 工人日报评论员 吴迪 房屋体检制度在各...
行政调解丨“问题种子”导致百亩... 齐鲁晚报·齐鲁壹点记者 李文璇 栾海明 一粒种子,关系着千家万户的“粮袋子”和“钱袋子”。2025...
“十五五”时期民间投资发展的法... “十五五”时期是我国基本实现社会主义现代化的关键时期,要落实《民营经济促进法》,从法律和制度上保障平...