算法 稀疏数组 数组优化 数组压缩 二维数组转稀疏数组 算法合集(二)

 1. 五子棋游戏,玩家对战一半停战休息,此时需要存储当前对战双方棋子信息

     a. 采用二维数组存储:

                                         0为空,

                                         1代表黑棋

                                         2代表蓝色棋子

      b. 棋盘为11行,11列 ==>   int [][] chessArray = new int [11][11];

      c. 出现的问题:整个数组,只存储了两个值。有点浪费内存空间==>延伸出将0,或其他相同数值抽出来,组成一个新的数组。与代码中抽出公共方法,有异曲同工之妙~

2. 稀疏数组(sparse array)  :当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。(例如保存棋盘数据,地图信息等)

3. 稀疏数组的处理方法是:

                                          1) 记录数组一共有几行几列,有多少个不同的值

                                          2) 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

 

   4. 思路分析:

                 

        a. 遍历原始二维数组,获取有效的数据个数(非0值个数sum);

        b. 创建稀疏数组 int [][] new sparseArr = new [sum + 1][3];

        c. 稀疏数组第一行存储原始数组信息,总共11行11列有2条有效数据,存入稀疏数组。所以稀疏数组需要sum+1行。

        c.  循环原始数组,将黑棋,蓝棋目前的位置信息,存入稀疏数组

        d. 打印下稀疏数组

        e. 稀疏数组转换为原始数组(原以为直接两层循环,再判断稀疏数组值是否在此循环内,进行使用,需要多层循环,思路不对。是稀疏数组向原始数组转换(解压缩),用非稀疏数组展示保存的棋盘数据)

package com.nami.algorithm.study.day01;/*** beyond u self and trust u self.** @Author: lbc* @Date: 2023-08-28 17:23* @email: 594599620@qq.com* @Description: keep coding*/
public class SparseArray {public static void main(String[] args) {// 创建一个原始的二维数组 11 * 11// 0: 表示没有棋子, 1 表示 黑子 2 表蓝子int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;// 输出原始的二维数组System.out.println("原始的二维数组~~");for (int[] row : chessArr1) {for (int data : row) {System.out.printf("%d\t", data);}System.out.println();}int sum = 0;for (int[] row : chessArr1) {for (int data : row) {if (data > 0) sum++;}}int sparseArr[][] = new int[sum + 1][3];// 给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;// 遍历二维数组,将非 0 的值存放到 sparseArr 中int count = 0; //count 用于记录是第几个非 0 数据for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}// 输出稀疏数组的形式System.out.println();System.out.println("得到稀疏数组为~~~~");for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);}System.out.println();//将稀疏数组 --》 恢复成 原始的二维数组//1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];//2. 在读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}// 输出恢复后的二维数组System.out.println();System.out.println("恢复后的二维数组");for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t", data);}System.out.println();}}}

   推荐尚硅谷算法视频

总结: 

          稀疏数组是对于原始数组的抽象,提取不同值进行存储。 稀疏数组第一行存储原始数组的行信息,列信息,非0值或不同值得个数,进行保存。使用时是稀疏数组向原始数组进行转换使用。它的作用相当于对数组进行压缩。解压缩,同压缩文件流程差不多意思                                           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/64087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【校招VIP】产品面试之面试官的真实意图

考点介绍&#xff1a; 大厂面试时&#xff0c;面试官提出的问题除了了解经历和想法外&#xff0c;最看重的是思维逻辑能力、团队协作能力和协调能力。 『产品面试之面试官的真实意图』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点题目 1. 你遇到的最大的…

无涯教程-Android - RadioButton函数

RadioButton有两种状态:选中或未选中,这允许用户从一组中选择一个选项。 Radio Button 示例 本示例将带您完成一些简单的步骤,以展示如何使用Linear Layout和RadioButton创建自己的Android应用程序。 以下是修改后的主要Activity文件 src/MainActivity.java 的内容。 packa…

Python 中的类,包括self关键字、类的属性限制访问

Python 中的类 一 、类和对象1.概念2.写法&#xff1a; 二、 self用法详解1.self代表类的实例&#xff0c;而非类2.self可以不写吗&#xff1f;3.在继承时&#xff0c;self的使用。 三、 属性限制访问1. 系统定义2.保护类型成员3.私有类型成员 一 、类和对象 1.概念 类是封装…

【1654. 到家的最少跳跃次数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。它可以 …

Git——Windows平台创建gitee私有仓库详解

目录 1. 安装git 2. gitbash配置 2.1 设置 2.2 生成key 2.3 项目管理 2.3.1 本地新建 2.3.2 clone远程仓库的工程到本地改文件 1. 安装git 默认安装。 2. gitbash配置 2.1 设置 打开gitbash&#xff0c;设置用户名和邮箱&#xff1a; git config --global user.name …

vue3封装echarts图表数据无法渲染到页面

问题是后端的数据已经成功返回到前端了&#xff0c;但是Echarts图表一直不能被渲染&#xff0c;卡了一个多小时&#xff0c;最后问gpt才解决&#xff08;gptyyds&#xff01;&#xff01;&#xff01;&#xff09; methods: {loadGet() {this.$axios.get(this.$httpUrl /goods…

Web安全——穷举爆破上篇(仅供学习)

Web安全 一、概述二、常见的服务1、burpsuite 穷举后台密码2、burpsuite 对 webshell 穷举破解密码3、有 token 防御的网站后台穷举破解密码3.1 burpsuite 设置宏获取 token 对网站后台密码破解3.2 编写脚本获取token 对网站后台密码破解 4、针对有验证码后台的穷举方法4.1 coo…

stm32之IIC协议

主要通过两个层面来讲&#xff1a;物理层、协议层。 IIC是一个同步半双工串行总线协议。 一、物理层&#xff08;通信模型&#xff09; 1、最早是飞利浦公司开发的这个协议&#xff0c;最早应用到其产品上去。 2、两线制&#xff08;两根信号线&#xff09; 其中SCL为时钟…

双网卡/内外网同时使用2023.09.01

1.双网卡 电脑需要两个网卡&#xff1a;两个网口或者是一个有线网卡加一个无线网卡。 查看网关&#xff1a;如下网口接入网线后&#xff0c;电脑连接WIFI&#xff0c;电脑会显示存在两个网卡正在使用&#xff08;电脑存在两个IP地址&#xff09; 查看本地的路由设置 route p…

服务器数据恢复- RAID5出现故障后恢复数据和操作系统的案例

服务器数据恢复环境&#xff1a; 某品牌服务器中有4块SAS硬盘组建了一组RAID5阵列&#xff0c;另外1块磁盘作为热备盘使用。上层操作系统为redhat linux&#xff0c;部署了一个数据库是oracle的OA。 服务器故障&初检&#xff1a; RAID5中一块磁盘离线后热备盘未自动激活re…

Vue 组件中如何引入外部的js文件 的10种方法

在Vue组件的<script>标签中使用import语句引入外部的JavaScript文件&#xff0c;适用于单个组件需要使用外部JavaScript文件的情况。这种方法可以在编译时静态地引入外部文件&#xff0c;并且可以通过import语句的路径指定具体的文件位置。 在Vue组件的<script>标…

设计模式-适配器

文章目录 一、简介二、适配器模式基础1. 适配器模式定义与分类2. 适配器模式的作用与优势3.UML图 三、适配器模式实现方式1. 类适配器模式2. 对象适配器模式3.类适配器模式和对象适配器模式对比 四、适配器模式应用场景1. 继承与接口的适配2. 跨平台适配 五、适配器模式与其他设…

Spring工具类--Assert的使用

原文网址&#xff1a;Spring工具类--Assert的使用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring的Assert工具类的用法。 Assert工具类的作用&#xff1a;判断某个字段&#xff0c;比如&#xff1a;断定它不是null&#xff0c;如果是null&#xff0c;则此工具类会报…

大数据课程K16——Spark的梯度下降法

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法&#xff1b; ⚪ 了解Spark的梯度下降法家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09;&#xff1b; ⚪ 掌握Spark的MLlib实现…

ChatGPT和文心一言的优缺点比较

ChatGPT和文心一言都是自然语言生成技术的代表&#xff0c;下面是它们的优缺点比较&#xff1a; ChatGPT的优点&#xff1a; 自由度高&#xff1a;ChatGPT生成的文本与给定的话题没有紧密的关联&#xff0c;可以灵活地生成多种不同的文本。多样性高&#xff1a;ChatGPT可以生…

Vue生命周期(详细)

生命周期 图&#xff1a; 可以理解vue生命周期就是指vue实例从创建到销毁的过程&#xff0c;在vue中分为8个阶段&#xff1a;创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后。 一、创建&#xff08;实例&#xff09; 1、beforeCreate&#xff1a…

【单片机】单片机入门指南

一、概述 单片机&#xff08;Microcontroller&#xff0c;简称MCU&#xff09;是一种集成了微处理器、存储器、时钟、IO端口和外设接口等的集成电路芯片。它可以通过编程实现各种控制、运算等功能&#xff0c;常用于自动化控制、家电、智能仪表等领域。 二、单片机的种类和选…

C语言每日一练-------Day(9)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;字符个数统计 多数元素 投票法 &#x1f493;博主csdn个人主页&#xf…

Docker及常用数据库安装

Docker安装常用数据库 1、Docker安装2、Mysql安装3、Redis安装4、DM安装5、Oracle安装1、Docker安装 1、确保 yum 包更新到最新yum update2、卸载旧版本(如果安装过旧版本的话)yum remove docker docker-common docker-selinux docker-engine3、安装需要的软件包, yum-util 提…