题目的要求

给你一个整数数组 nums ,返回其中 按位与三元组 的数目。

按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:

0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。

题目的实例2

输入:nums = [0,0,0]
输出:27
  • 1 <= nums.length <= 1000
  • 0 <= nums[i] < 2^16


思路:
1.枚举
我们正常的解法可能就需要用三重的for循环,时间复杂度是O(n^3).在这里我们可以先用双重for循环来遍历 nums[i]&nums[j]的值,将他们存入到hash表中
这里我们直接采用数组作为hash表,nums[i]<2^16次方,nums[i]&nums[j] < 2^16。数组的长度最大开2^16次方.然后我们在进行双重for循环,第一层for
循环是接着遍历数组,第二重for循环我们就直接枚举m,判断 nums[k]&m是否等于0,等于0就去hash表中查找m是否存在(枚举值是否是之前进入hash表的nums[i]
&nums[j]),时间复杂度为O(n^2+n*2^16)
代码如下(typescript)
 1 function countTriplets(nums: number[]): number {
2 //枚举法
3 //用map(Array)来存放I下标和J下标的&值,然后再用双重for循环,一个是Z下标,一个值用来枚举map , 时间复杂度是O(n^2+2^16*n)
4 const map = new Array(1 << 16).fill(0)
5 //往map(数组)中添加元素
6 for(const i of nums) {
7 for(const j of nums){
8 map[i&j]++
9 }
10 }
11 let sum:number = 0
12 //再用枚举获取数值
13 for(const x of nums){
14 for(let i:number = 0; i < (1<<16); i++) {
15 if(<number>(x & i) == 0) {
16 sum += map[i]
17 }
18 }
19 }
20 return sum
22 };

优化

在思路1的基础上我们可以采用子集优化的方式,在第二次遍历数组的时候我们获取到nums[k],假设将nums[k]转换成二维数组 5 = (101) ,将数值为1的下标放入到集合中,也就是{1,3},命名为集合A。nums[k]&m等于0就代表nums[k]代表的集合和m代表的集合没有交集,m是CuA的子集。这样我们就可以直接枚举CuA的子集来优化算法。在本题中Cu是2^16也就是{1,2,...,16}也就是0xffff.有了Cu,那么我们如果遍历CuA的子集m呢。我们可以直接通过 m = (m-1)&CuA的写法来,一般来说是将m-1然后和CuA相与,如果结果是m-1代表它就是CuA的子集。(m-1)&CuA的写法的思路是,m-1的子集就是m的子集,m-1就是把m的最右位的1变成0,把该1右侧的0变成1,这样可以直接通过 & CuA快速获取到下一个子集.已经清楚了如何快速获取子集,那么结束的条件是啥呢, 当m-1达到-1时,-1的二进制码全是1,这个时候和CuA相与结果就变成了CuA,所以当m&CuA = CuA的时候就代表结束了这次操作

代码(typescript)

function countTriplets(nums: number[]): number {
//枚举法
const map = new Array(1 << 16).fill(0)
//往map(数组)中添加元素
for(const i of nums) {
for(const j of nums){
map[i&j]++
}
}
let sum:number = 0
for(let x of nums){
//获取亦或值
      
x ^= 0xffff
let mid = x
do{
sum += map[mid]
mid = (mid-1) & x
}while(mid != x)
}
return sum
};
 

2023.3.4Leecode982按位与为零的三元组的更多相关文章

  1. [Swift]LeetCode982. 按位与为零的三元组 | Triples with Bitwise AND Equal To Zero

    Given an array of integers A, find the number of triples of indices (i, j, k) such that: 0 <= i & ...

  2. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  3. leetcode难题

    4 寻找两个有序数组的中位数       35.9% 困难     10 正则表达式匹配       24.6% 困难     23 合并K个排序链表       47.4% 困难     25 K ...

  4. 《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构

    第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址.连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址. 路由器(见 IP 协议 一章 ...

  5. LeetCode 15 3Sum [sort] <c++>

    LeetCode 15 3Sum [sort] <c++> 给出一个一维数组,找出其中所有和为零的三元组(元素集相同的视作同一个三元组)的集合. C++ 先自己写了一发,虽然过了,但跑了3 ...

  6. 算法(第四版)C# 习题题解——1.4

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 这一节内容可能会用到的库文件有 ...

  7. java编程之:按位与运算,等运算规则

    按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; 即:两位 ...

  8. C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解

    C#版 - Leetcode 201. 数字范围按位与(bitwise AND) - 题解 在线提交: https://leetcode.com/problems/bitwise-and-of-num ...

  9. 零基础学Python--------第2章 Python语言基础

    第2章  Python语言基础 2.1 Python语法特点 2.11注释 在Python中,通常包括3种类型的注释,分别是单行注释.多行注释和中文编码声明注释. 1.单行注释 在Python中,使用 ...

  10. 二进制按位与(&) 按位或(|)  异或运算(^)

    1.参加运算的两个数据,按照二进制进行按位与的运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1; 即:两位同时为“1”,结果才为 ...

随机推荐

  1. loadrunner11汉化时提示模块插件无法注册的解决方法

    安装汉化程序时,关闭杀毒软件.

  2. matlab狄拉克锥的三维图

    石墨烯(graphene)中的狄拉克锥(Dirac cone)图形.直接按照能级公式绘图,公式参考[1]中 energy of the electrons 公式. %matlab代码 clear; g ...

  3. axios 使用方法 以及服务器端 设置拦截发送404状态的提示语,当网络错误时候返回前端的提示, 当网络正常的时候返回后端的提示

    本文旨在说明  设置全局异常拦截器 当网络错误时候返回前端的提示, 当网络正常的时候返回后端的提示 export default ({ development: { baseURL: 'http:// ...

  4. angular使用_HttpClient或者Fetch发送POST/GET请求下载/上传文件

    一:下载文件写法 1.post请求_HttpClient写法. myTest() { const params = { aa: "aa", bb: "bb" } ...

  5. Ubuntu安装Anaconda并且配置国内镜像教程

    前言 我们在学习 Python 的时候需要不同的 Python 版本,关系到电脑环境变量配置换来换去很是麻烦,所以这个时候我们需要一个虚拟的 Python 环境变量,我之前也装过 virtualenv ...

  6. 我们从 CircleCI 安全事件获得的3个经验教训

    CircleCI 作为业内最受欢迎的 CI/CD 平台提供商之一,有超过20万个 DevOps 团队使用其平台.该公司在今年1月在其官网报告了一起安全事件引起客户恐慌.在此事件中,有身份不明的恶意攻击 ...

  7. 第三方模块:requests模块和openpyxl模块

    1.第三方模块的下载应由 第三方模块:别人写的模块 一般情况下功能都特别强大 我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块) 下载第三方模块的方式 1.pip工具 注意 ...

  8. C-09\编译预处理

    一.预处理 C语言在对源程序进行正常编译之前,会先对一些特殊的预处理命令作解释,产生一个新的源程序,该过程称为编译预处理 为了区分预处理命令和一般的C语句,所有预处理命令行都以"#" ...

  9. 复制内容到剪切板通用的js方法

    复制内容到剪切板通用的js方法 /** * 复制内容到剪切板 * @param text 要复制的内容 */ function Clipboard(text) { if (navigator.clip ...

  10. UBUNTU16.04卸载安装protobuf

    1.卸载 sudo apt-get remove libprotobuf-dev which protoc 然后删除路径即可 2.安装 sudo apt-get install autoconf au ...