首先我们看一个需求

在11 * 11 的五子棋的棋盘中 我们使用0代表十字交叉点也是无效的数据 用1代表黑棋 用2代表蓝棋

那么所看到的棋盘如下



改用数字显示后就如一下样式



现在我们需要将怎个棋盘存储起来,但是又发现有很多为0 的无效数据,那么我们就需要考虑将有效的数据存储无效的数据不用存储起来

这样我们就可以使用稀疏数组将数据存储起来

稀疏数组

稀疏数组有一定会有三行,列是随有效数据的个数而变化的,先看一个稀疏数组的大概样子

二维数组转换为稀疏数组的思路

  • 第一部 需要遍历稀疏数组,获取有效数据的个数(sum),改个数可以用来确定稀疏数组的行数,那么稀疏数组的行数就是(sum + 1)【因为稀疏数组的第一行是原始二维数组已经确定好了的】
  1. //统计原始二维数组中的有效数据的个数,sum代表二维数组中有效数据的个数
  2. int sum = 0;
  3. for (int i = 0; i < chessArr.length; i++) {
  4. for (int j = 0; j < chessArr.length; j++) {
  5. if (chessArr[i][j] != 0){
  6. sum++;
  7. }
  8. }
  9. }
  10. System.out.println("有效数据的个数为:" + sum);
  • 第二部 创建一个稀疏数组 int[][] sparseArr[sum +1 ][3]
  1. //1. 创建稀疏数组
  2. int sparseArr[][] = new int[sum + 1][3];
  • 第三部 遍历稀疏数组中的有效数据的索引和值,并将有效数据存入稀疏数组中
  1. //给稀疏数组的第一行复制
  2. sparseArr[0][0] = 11;
  3. sparseArr[0][1] = 11;
  4. sparseArr[0][2] = sum; --sum(有效数据的个数)
  5. //2. 给稀疏数组赋值,count用于计数,计算该稀疏数组的第几行
  6. int count = 0;
  7. for (int i = 0; i < chessArr.length; i++) {
  8. for (int j = 0; j < chessArr.length; j++) {
  9. if (chessArr[i][j] != 0){
  10. count++;
  11. sparseArr[count][0] = i;
  12. sparseArr[count][1] = j;
  13. sparseArr[count][2] = chessArr[i][j];
  14. }
  15. }
  16. }

稀疏数组转换为二维数组的思路

  • 第一部 读取稀疏数组的第一行,利用第一行的数据,创建出没有有效数据的二维数组 reChessArr = int[sparseArr[0][0]][sparseArr[0][1]];

    int reChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
  • 第二部 遍历稀疏数组的后几行数据,并且赋值给 reChessArr, 这样就还原了有数据的二维数组
  1. //给还原后的二维数组赋值
  2. for (int i = 1; i < sparseArr.length; i++) {
  3. reChessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
  4. }

全部代码地址

码云(gitee): dataStructures-sparseArray

github: dataStructures-sparseArray

二维数组与稀疏数组的转换---dataStructures的更多相关文章

  1. 二维数组转稀疏数组、稀疏数组恢复二维数组(Java实现)

    public static void main(String[] args) { // 创建一个原始的二维数组 9*9 int chessArr1[][] = new int[9][9]; // 0表 ...

  2. java基础——多维数组和稀疏数组

    多维数组 多维数组可以堪称数组的数组,比如二维数组就是一个特殊的一维数组,其中每一个元素都是一个以为数组 而且数组 int a[][]= new int[2][3]; public class Arr ...

  3. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  4. poj3067 二维偏序树状数组

    题解是直接对一维升序排列,然后计算有树状数组中比二维小的点即可 但是对二维降序排列为什么不信呢?? /* */ #include<iostream> #include<cstring ...

  5. hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)

    题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少. 由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j) ...

  6. 二维偏序+树状数组【P3431】[POI2005]AUT-The Bus

    Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...

  7. $[SHOI2007]$ 园丁的烦恼 二维数点/树状数组

    \(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y ...

  8. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

  9. 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

随机推荐

  1. 『学了就忘』Linux系统管理 — 83、Linux中进程的查看(top命令)

    目录 1.top命令介绍 2.top命令示例 3.top命令输出项解释 4.top命令常用的实例 1.top命令介绍 top命令是用来动态显示系统中进程的命令. [root@localhost ~]# ...

  2. noVNC实现浏览器远程访问Windows桌面

    一.简介 1.VNC介绍 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件.VNC 是在基于 UNIX 和 Linux 操作系统的免费 ...

  3. [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp

    [V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...

  4. JavaFx Tooltip悬浮提示使用及自定义

    原文:JavaFx Tooltip悬浮提示使用及自定义 | Stars-One的杂货小窝 本篇是基于TornadoFx框架对Tooltip组件进行讲解,使用Kotlin语言,和传统Java使用有所区别 ...

  5. CF508A Pasha and Pixels 题解

    Content 有一个 \(n\times m\) 的矩阵,一开始全部格子被染成白色. 接下来有 \(k\) 个操作,每一个操作表示把一个格子染成黑色.问第一次出现 \(2\times 2\) 的全部 ...

  6. LuoguB2133 我家的门牌号 题解

    Update \(\texttt{2021.11.27}\) 修复了代码中的 \(10000\) 写成 \(n\) 的错误. Content 一个家庭住在一个胡同里面,门牌号从 \(1\) 开始编号. ...

  7. IDEA常用设置及插件

    设置 1.设置打开后不直接进入项目 IDEA默认打开时会直接进入上次打开的目录,有的时候加载很长时间,但这个时候可能我们并不是要打开这个项目,这里有一个设置,在如图的位置,去掉勾选,即可设置打开后不直 ...

  8. Elasticsearch删除所有数据

    使用post请求 POST http://localhost:9200/索引/标签/_delete_by_query?pretty { "query": { "match ...

  9. 【LeetCode】293. Flip Game 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...

  10. 【LeetCode】910. Smallest Range II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...