当前位置: 首页 > news >正文

982. 按位与为零的三元组

1. 题目

982. 按位与为零的三元组

2. 解题思路

随机选择两个数,记录两个数的与结果。以及它的次数。
然后再遍历数组,用第三个数去与前两个数的结果,如果等于0,则满足条件。

3. 代码

3.1. 注意点

首先用简单的思路切入,map来存储数组中每两个数组进行&的结果,然后遍历数组用数组中的每一个数和另外两个数&的结果再进行& 看是不是等于0。
等于0则从map取出,另外两个数进行&后的值的数量加到结果上去。
上面这句话不好理解,我来举个例子:
假设数组为[2,1,3],那么

  • (i=0, j=0, k=1) : 2 & 2 & 1
  • (i=0, j=1, k=0) : 2 & 1 & 2
  • 。。。。。

可以看到这两种情况,i=0,k=1 &的结果为0,会被放到map,那么i=0,j=1 &的结果也是0,那么也会放到map,这个时候map中有个元素就是<0,2> ,代表两个元素进行&后结果为0的,有两对元素。
当第三轮遍历的时候,取nums中的数字去与另外两个数的&结果进行&运算,发现结果为0,但是整个数组中 另外两个数的&结果 为0,的数字有2对,所以结果应该是res +=map.get(另外两对数字的结果)

上面的思路虽然简单,但是在PAT中会超时,那么用int[]来替代map优化时间复杂度

[!NOTE] 1、int数组的大小为什么是2^16
image.png

[!NOTE] 2、bitCount每一位的含义是什么?
bitCount[0]代表两个数字&操作后结果为0的个数…以此类推
image.png

3.2. 完整代码

超时版本(容易理解)

class Solution {public int countTriplets(int[] nums) {int count = 0;Map < Integer, Integer > map = new HashMap < > ();for (int i: nums) {for (int j: nums) {int count1 = map.getOrDefault(i & j, 0);map.put(i & j, count1 + 1);}}for (Integer num: map.keySet()) {for (int m: nums) {if ((m & num) == 0) {count += map.get(num);}}}return count;}
}

优化时间复杂度后的版本:

class Solution {public int countTriplets(int[] nums) {// 用于存储按位与结果的次数,数组长度为 65536,因为 int 是 16 位的二进制数int[] bitCount = new int[1 << 16]; // 2^16 = 65536int res = 0;// 预处理:计算所有两数的按位与结果,存储其出现的次数for (int i: nums) {for (int j: nums) {int andResult = i & j;bitCount[andResult] ++;}}// 再次遍历数组,查找哪些数与之前的按位与结果为0for (int num: nums) {for (int i = 0; i < bitCount.length; i++) {if ((num & i) == 0) {res += bitCount[i]; // 累加符合条件的次数}}}return res;}
}

相关文章:

  • UI设计师面试整理-工具和技术技能
  • list(二) (list模拟实现)
  • HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
  • CANopen开源库canfestival的移植
  • 深度解析APP软件开发:构建卷轴式分销系统的实践探索
  • 一个PDF样本册免费上传网站
  • 【HTTP 和 HTTPS详解】3
  • 【PAM】Linux登录认证限制
  • 前后端传参
  • 企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商
  • EZUIKit.js萤石云vue项目使用
  • BufferQueue低延迟优化,以及SurfaceView帧率上限问题解决
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26
  • 【移植】小型系统平台驱动移植
  • 计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档
  • CentOS6 编译安装 redis-3.2.3
  • es的写入过程
  • export和import的用法总结
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux Process Manage
  • PAT A1017 优先队列
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpingCloudBus整合RabbitMQ
  • storm drpc实例
  • 从0实现一个tiny react(三)生命周期
  • 如何设计一个比特币钱包服务
  • 线性表及其算法(java实现)
  • 小程序button引导用户授权
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​iOS实时查看App运行日志
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (HAL库版)freeRTOS移植STMF103
  • (TOJ2804)Even? Odd?
  • (vue)页面文件上传获取:action地址
  • (区间dp) (经典例题) 石子合并
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)c52学习之旅-动态数码管
  • .libPaths()设置包加载目录
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net IE10 _doPostBack 未定义
  • .Net Web窗口页属性
  • .net 托管代码与非托管代码
  • .Net多线程总结
  • @Async 异步注解使用
  • @Autowired标签与 @Resource标签 的区别
  • @WebService和@WebMethod注解的用法
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [BROADCASTING]tensor的扩散机制
  • [BZOJ] 3262: 陌上花开
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5