今天做一个LeetCode题发现一个小技巧,特来与你们分享一下。做的LeetCode题是关于二维矩阵的图论建模,像下面这样的:

图论建模

二维矩阵可以不产生一个图结构,直接在二维矩阵上计算。相应地,会设定一个布尔值数组visited[ i ] [ j ],表示某一个位置是否被遍历,true表示被遍历,false表示未被遍历。我们首先看看图论建模是如何建模的, 二维数组会有两个索引下标i和j,分别对阵为行和列。我们会设定一个常量C,而这个常量正是列的长度,即nums[i].length。对二维矩阵每一个位置都可以用 i * C + j 表示,如下图:

代号

如果图结构想转换成二维矩阵也可以这样表示,假设图结构的一个节点的键为g,位于二维矩阵的,第几行用 g / C 表示,第几列用 g % C 表示。

i = g / C; // 获得第几行j = g % C; // 获得第几列

三维矩阵也是通过这样的方式进行图论建模,会设定两个常量,一个是 j 的长度,另一个是 i 和 j 的面积。这里就不进行多介绍了,因为本篇介绍布尔值数组压缩状态的小技巧,再讲三维矩阵的图论建模就偏了,了解二维矩阵就好了。在进行二维矩阵的图论建模中,如果不转成图形结构,直接在二维矩阵上计算,我们会设定一个布尔类型的二维数组visited,数组的值表示图的某个节点是否遍历过。接着我们可以把true看作是1,false看作是0,然后转成一维数组,如下表示:

[0 0 0 0 00 0 0 0 0   =>   [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]0 0 0 0 0]

然后可以把这看作是二进制,将一维数组直接转成一个数字。最重要的是,转成了一个数字,如何查看某个节点是否被遍历过,又如何将某个节点设成0和1。我们可以这样做,假设visited一维数组为[0 0 0 1 0],表示第3位已经遍历过,转成二进制表示为0b01000,转成十进制表示为8。我们看第0位是否是0,将visited与0b00001进行与运算,返回结果,如果结果为0说明没有遍历过;如果结果不为0遍历过。

  0b01000& 0b00001----------   =>   8 & (2^0) = 0  0b00000

我们看第3位是否是0,将visited与0b01000进行与运算,返回结果。

  0b01000& 0b01000----------   =>   8 & (2^3) = 8  0b01000

可以总结为:

visited & (2^i) == 0 ? 未遍历过 : 遍历过; // visited表示一个数字,i 表示第几位2^i 也可以用 1<即:visited & (1<0 ? 未遍历过 : 遍历过;

那如何将某个节点设成1或0呢?我们将第1位设为1,表示第1位刚遍历过,

  0b01000+ 0b00010----------   =>   8 + (2^1) = 10  0b01010注意:要提前判断第1位是否为1,如果不是可以设为1,如果是则忽略。

将第2位设为1,表示第2位刚遍历过,

  0b01010+ 0b00100----------   =>   10 + (2^2) = 14  0b01110

可以总结为:

// 如果第i位为0,设为1:if(visited & (2^i) == 0) // visited表示一个数字,i 表示第几位    visited += 2^i;// 2^i 也可以用 1<if(visited & (1<0)    visited += 1<

同理,将第i位设为0,可以总结为:

// 如果第i位为1,设为0:if(visited & (2^i) != 0) // visited表示一个数字,i 表示第几位    visited -= 2^i;// 2^i 也可以用 1<if(visited & (1<0)    visited -= 1<

举一反三,学会了二进制数组压缩成一个数字的状态,多进制数组也同样可以压缩状态,只需要找到最大的那个数就可以了。如果找到最大的数为5,那就成六进制;如果找到最大的数为25,那就成二十六进制。如果数字确实比较大,也可以考虑最小的数,进行一一映射。通过这样的状态压缩,很多指数级别的空间复杂度直接降为O(1),省空间了。关注「算法无遗策」,一起领悟算法的魅力,大家加油 (●'◡'●)

二维数组遍历_布尔值数组的状态压缩相关推荐

  1. smarty二维foreach示例[顺代一维数组],再次加强版

    2019独角兽企业重金招聘Python工程师标准>>> smarty二维foreach示例[顺代一维数组],再次加强版   WEB2.0  root 2009-4-9 10:46  ...

  2. php利用数组循环输出,php数组遍历,php循环输出数组

    php数组遍历,php循环输出数组,PHP数组循环遍历的四种方式 [(重点)数组循环遍历的四种方式] 1,https://www.cnblogs.com/waj6511988/p/6927208.ht ...

  3. php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)

    php课程 4-15  数组遍历.超全局数组.表单提交数据(多看学习视频) 一.总结 一句话总结:超全局数组特别有用,比如$_SERVER可以获取所有的客户端访问服务器的情况. 1.数组遍历三种方式( ...

  4. python二维字典简单赋值取值

    python二维字典简单赋值取值 一维字典 二维字典 访问二维字典 字典和列表的区别 小白一个,记录python二维字典的学习 一维字典 字典是用花括号来定义的,比如 dict = {'姓名':'汪汪 ...

  5. 二维码简介_二维码基本概念_二维码基本原理

    一.二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Ba ...

  6. java二维数组遍历后转为一维数组_[基础篇]-基础知识整理-05-数组基本概念

    数组 数组是大部分编程语言所支持的数据结构,Java也支持数组,Java的数组是一种引用类型的变量,Java程序通过数组引用变量来操作数组,包括获取数组的长度,访问数组的值等. 数组的基本概念 数组是 ...

  7. java二维数组遍历后转为一维数组_java数组(一)

    数组的定义 数组是相同类型数据的有序集合. 简单理解就是:数组是由若干个相同类型的数据,按照一定的顺序组合而成的.数组中的每一个数据我们可以称为元素,每个元素可以通过索引(下标)来访问(获取). 数组 ...

  8. mysql二维转一维_二维数组转为一维数组

    1.很多时候会遇到二维数组,转为一维数组的时候会很苦恼,尤其是刚刚接触PHP的phper. 如下:将$arr转化为一维数组 $arr = Array ( Array ( 'uuid' => 'a ...

  9. javascript二维数组转置_精通Excel数组公式010:认识数组函数:TRANSPOSE、MODE.MULT和TREND...

    学习Excel技术,关注微信公众号: excelperfect 数组函数是可以提供多个值的Excel内置函数.下面列出了8个Excel内置的数组函数: TRANSPOSE函数 MODE.MULT函数( ...

  10. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组

    满意答案 vi31892i 2013.09.11 采纳率:44%    等级:11 已帮助:6956人 这好象是汇编语言的问题吧 举个例子吧 #include "iostream.h&quo ...

最新文章

  1. 学习jQuery的on事件
  2. SURF算法与源码分析、下
  3. 浅谈提升C#正则表达式效率
  4. 为什么盯一个字看久了,反而感觉不认识了?
  5. 前端学习(3025):vue+element今日头条管理-侧边导航菜单
  6. 我们身边的知识产权单元测试答案(期末考试复习)【湘潭大学】
  7. linux python指向python3_linux下切换python2和python3(转)
  8. apache 配置php 版本错误u,PHP+Apache+MySQL 在配置环境时遇到的问题
  9. STL系列使用教程(一)基础概念
  10. Office 365 Pro Plus 离线安装包及自定义部署工具下载地址
  11. 真正的创业者和伪创业者的区别在哪里?
  12. 精确率、召回率、F1 值、ROC、AUC
  13. C语言随笔小算法:单项链表如何实现队列
  14. 解决打开excel报文件格式或文件扩展名无效的问题
  15. 跟二项分布相关的统计检验方法
  16. 怎样拆卸惠普微型计算机,HP Compaq 8200 Elite USDT微机拆机给风扇加油
  17. 后端开发发展学习路线
  18. Druid实现数据库连接用户密码加密
  19. CSDN怎么更换皮肤
  20. 学生如何免费申请使用idea

热门文章

  1. 腾讯的bugly的更新和热更新
  2. 发送HTTP请求返回415状态码的解决办法
  3. asp.NET导出Gridview到excel 带模板列显示
  4. tableMerge 表格列自动合并
  5. Win10显示文件扩展名
  6. Js、Jquery密码输入框的密码显示与隐藏
  7. PHP中cURL的curl_getinfo函数返回的CURLINFO_HTTP_CODE是0
  8. 全网首发:JDK绘制文字系列博文汇总
  9. 老显卡都涨价了,所以我把坏的显卡拿出来修
  10. 全网首发:deb打包时报错dh: Please specify the compatibility level in debian/compat