二维数组遍历_布尔值数组的状态压缩
二维矩阵可以不产生一个图结构,直接在二维矩阵上计算。相应地,会设定一个布尔值数组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),省空间了。关注「算法无遗策」,一起领悟算法的魅力,大家加油 (●'◡'●)
二维数组遍历_布尔值数组的状态压缩相关推荐
- smarty二维foreach示例[顺代一维数组],再次加强版
2019独角兽企业重金招聘Python工程师标准>>> smarty二维foreach示例[顺代一维数组],再次加强版 WEB2.0 root 2009-4-9 10:46 ...
- php利用数组循环输出,php数组遍历,php循环输出数组
php数组遍历,php循环输出数组,PHP数组循环遍历的四种方式 [(重点)数组循环遍历的四种方式] 1,https://www.cnblogs.com/waj6511988/p/6927208.ht ...
- php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)
php课程 4-15 数组遍历.超全局数组.表单提交数据(多看学习视频) 一.总结 一句话总结:超全局数组特别有用,比如$_SERVER可以获取所有的客户端访问服务器的情况. 1.数组遍历三种方式( ...
- python二维字典简单赋值取值
python二维字典简单赋值取值 一维字典 二维字典 访问二维字典 字典和列表的区别 小白一个,记录python二维字典的学习 一维字典 字典是用花括号来定义的,比如 dict = {'姓名':'汪汪 ...
- 二维码简介_二维码基本概念_二维码基本原理
一.二维码简介_二维码基本概念_二维码基本原理 1.二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Ba ...
- java二维数组遍历后转为一维数组_[基础篇]-基础知识整理-05-数组基本概念
数组 数组是大部分编程语言所支持的数据结构,Java也支持数组,Java的数组是一种引用类型的变量,Java程序通过数组引用变量来操作数组,包括获取数组的长度,访问数组的值等. 数组的基本概念 数组是 ...
- java二维数组遍历后转为一维数组_java数组(一)
数组的定义 数组是相同类型数据的有序集合. 简单理解就是:数组是由若干个相同类型的数据,按照一定的顺序组合而成的.数组中的每一个数据我们可以称为元素,每个元素可以通过索引(下标)来访问(获取). 数组 ...
- mysql二维转一维_二维数组转为一维数组
1.很多时候会遇到二维数组,转为一维数组的时候会很苦恼,尤其是刚刚接触PHP的phper. 如下:将$arr转化为一维数组 $arr = Array ( Array ( 'uuid' => 'a ...
- javascript二维数组转置_精通Excel数组公式010:认识数组函数:TRANSPOSE、MODE.MULT和TREND...
学习Excel技术,关注微信公众号: excelperfect 数组函数是可以提供多个值的Excel内置函数.下面列出了8个Excel内置的数组函数: TRANSPOSE函数 MODE.MULT函数( ...
- java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组
满意答案 vi31892i 2013.09.11 采纳率:44% 等级:11 已帮助:6956人 这好象是汇编语言的问题吧 举个例子吧 #include "iostream.h&quo ...
最新文章
- 学习jQuery的on事件
- SURF算法与源码分析、下
- 浅谈提升C#正则表达式效率
- 为什么盯一个字看久了,反而感觉不认识了?
- 前端学习(3025):vue+element今日头条管理-侧边导航菜单
- 我们身边的知识产权单元测试答案(期末考试复习)【湘潭大学】
- linux python指向python3_linux下切换python2和python3(转)
- apache 配置php 版本错误u,PHP+Apache+MySQL 在配置环境时遇到的问题
- STL系列使用教程(一)基础概念
- Office 365 Pro Plus 离线安装包及自定义部署工具下载地址
- 真正的创业者和伪创业者的区别在哪里?
- 精确率、召回率、F1 值、ROC、AUC
- C语言随笔小算法:单项链表如何实现队列
- 解决打开excel报文件格式或文件扩展名无效的问题
- 跟二项分布相关的统计检验方法
- 怎样拆卸惠普微型计算机,HP Compaq 8200 Elite USDT微机拆机给风扇加油
- 后端开发发展学习路线
- Druid实现数据库连接用户密码加密
- CSDN怎么更换皮肤
- 学生如何免费申请使用idea
热门文章
- 腾讯的bugly的更新和热更新
- 发送HTTP请求返回415状态码的解决办法
- asp.NET导出Gridview到excel 带模板列显示
- tableMerge 表格列自动合并
- Win10显示文件扩展名
- Js、Jquery密码输入框的密码显示与隐藏
- PHP中cURL的curl_getinfo函数返回的CURLINFO_HTTP_CODE是0
- 全网首发:JDK绘制文字系列博文汇总
- 老显卡都涨价了,所以我把坏的显卡拿出来修
- 全网首发:deb打包时报错dh: Please specify the compatibility level in debian/compat