自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 [077] Java 用递归和贪心算法解决和优化“骑士周游问题”

1、问题及算法描述问题:在一个 8*8 的棋盘上,马按照“日”字走,给定一个起点,打印出马不重复的走完棋盘64个格子的路径。 解答:递归 + 回溯 。对于任一步,马能走的下一步最多有8个位置,满足两个条件: 依旧在棋盘内; 没有被访问过; 如果下一步没有可选项,这时候就需要回溯,选择新的下一步。 优化: 暴力递归,对于8*8的棋盘,一般需要运行30秒左右才能出来结果; 优化方式:贪心算法优化,对下一步的下一步可选择数目做非递减排序,然后选择走数目最少的一步,减少回溯的次数;

2020-11-09 15:40:19 327 1

原创 [076] Java “弗洛伊德算法”解决“最短路径问题”

1、问题及算法描述问题:在有权图中,如何求从各顶点出发到其他各顶点的最短路径? 弗洛伊德算法:1962年由Robert Floyd提出,用于求加权图中的最短路径问题,相比迪杰斯特拉算法,前者执行效率更高,更容易理解,且能一次性求得各顶点到其他各顶点的最短距离(迪杰斯特拉算法只能求得一个顶点到其他顶点的最短路径)。 步骤: ① 从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。 ② 对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到

2020-11-08 15:18:24 272

原创 [075] Java “迪杰斯特拉算法”解决“最短路径问题”

1、问题及算法描述迪杰斯特拉算法:由荷兰计算机科学家狄克斯特拉于1959 年提出,解决有权图中的最短路径问题,即从一个顶点到其余各顶点的最短路径; 特点:以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止; 问题:从G点出发,访问其他所有顶点,求行走的最短路径; 2、Java代码/*迪杰斯特拉算法求最短路径 */package Algorithm.Dijkstra;import java.util.Arrays;/** * @author bigyang

2020-11-08 09:35:56 251

原创 [074] Java “克鲁斯卡尔算法(Kruskal)”解决“修路问题”

1、问题及算法描述“修路问题”与“普利姆算法”所解决的问题相同; 克鲁斯卡尔算法(Kruskal Algorithm),用于求加权连通图的最小生成树; 步骤:含n个顶点的森林,按照权值从小到大的顺序选择n-1条边加入到最小生成树中,并使树; 核心:排序 + 不构成回路。2、Java代码package Algorithm.Kruskal;import java.util.Arrays;/** * @author bigyang * @date 2020/11/05 */pub

2020-11-07 12:23:16 294

原创 [073] Java “普利姆算法(Prim)”解决“修路问题”

1、问题及算法描述生成树:含有 n 个顶点的连通图可以构成多种生成树,如下图(a)。但最少可用n-1条边将所有顶点连接起来,如下图(b); 最小生成树:对带有权值的图,生成树路径中权值总和最小的路径,称为最小生成树。最小生成树的顶点为 n,边为 n-1; 修路问题:有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通,各个村庄的距离用边线表示(权) ,如何修路保证各个村庄都能连通,并且总的修建公路总里程最短? Prim(普里姆)算法: ​​​​​​​①...

2020-11-05 15:57:59 263

原创 [072] Java 使用哈希表和“贪心算法”解决“集合覆盖问题”

1、问题和算法描述使用哈希表,集合及贪心算法解决“集合的覆盖问题”:选择最少的广播台,能覆盖所有的地区; K1 “北京”、“上海”、“天津” K2 “广州”、“北京”、“深圳” K3 “成都”、“上海”、“杭州” K4 “上海”、“天津” K5 “杭州”、“大连” 贪心算法的思想:每次都选择覆盖最广(未覆盖地区)的电台,然后更新未覆盖地区集合,重复这两步操作,直到未覆盖地区集合为空; 最后通过贪心算法,选出来...

2020-11-04 15:48:57 193

原创 [071] Java “字符串匹配问题”的“暴力匹配算法”和“KMP算法”

1、问题和算法简介字符串匹配问题:有一个源字符串S(例:"BBC ABCDAB ABCDABCDABDE"),和一个模式串P(例:"ABCDABD"),现在要查找P在S中的位置,怎么查找呢? 暴力匹配算法:模式串P逐一去匹配S,匹配失败就回溯到上次开始匹配位置的下一个位置再次重新匹配;如下图,当方框内空格和D字符没有匹配上,就回溯到箭头处。 KMP算法:由三个人联合发表的算法,是暴力匹配算法的改进版,匹配失败后的回溯位置不是上次开始匹配位置的下一个位置,而是跳过已经比较过的部分,跳动的位数 =

2020-11-04 10:56:55 143

原创 [070] Java “背包问题”

1、背包问题背包问题:限定容量的背包,求放入物品总价值最大的方式 01背包:有N件物品和一个容量为V的背包,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大; 完全背包:有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大; 多重背包:有N种物品和一个容量为V的背包,第i种物品最多有Mi件可用,每件物品消耗的容量为Ci,价值为Wi,求解入哪些物品可以使得背包中总价值最大。 2

2020-11-04 10:06:41 123

原创 [069] Java “分治算法”求解“汉诺塔问题”

1、分治算法和汉诺塔问题分治算法:Divide - and - Conquer,即“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题太......直到最后子问题可以简单的直接求解,原问题的解就是子问题的解的合并。 步骤: 分解:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题; 解决:若子问题规模较小而容易被解决就直接解决,否则考虑递归地解各个子问题; 合并:将各个子问题的解合并成原问题的解。 汉诺塔问题: 藐视:三根高度

2020-11-02 10:09:35 95

原创 [068] Java “二分查找法”的非递归实现

1、二分查找法原理及递归实现。2、Java代码/*不使用递归的二分查找法 */package Algorithm.Search;/** * @author yhx * @date 2020/11/02 */public class BinarySearchNoRecursion { public static void main(String[] args) { int[] arr = {1, 3, 8, 10, 11, 67, 100};

2020-11-02 09:04:14 69

原创 [067] Java “图”

1、图1、为什么要用图:线性表局限于一个前驱一个后继,树只能有一个前驱(父节点),这两种数据结构可表征的结构形式较为简单,无法表示多对多的关系; 2、什么是图:一种数据结构,其中的节点可具有零个或多个相邻元素;两个节点之间的连线称为边,节点也称顶点; 3、分类: ① 无向图(undirected graph):一个图结构中,所有的边都没有方向性; ② 有向图(directed graph):一个图结构中,边有方向性; ③ 带权图:一个图结构中,边具有权值;也称为网;

2020-10-30 14:43:14 96

原创 [066] Java “多叉树”

1、多叉树二叉树的缺陷:每个节点只有1个数据域及2个子树指针域,当节点过多时,树的高度增加,使用时频繁执行I/O操作,导致速度降低;

2020-10-29 18:47:31 345

原创 [065] Java “平衡二叉树”

1、平衡二叉树概念:平衡二叉树(Balanced Binary Tree)又被称为AVL树,首先这是一棵 “二叉排序树” ,其次它的左右两个子树的高度差的绝对值不超过1,这很好的解决了二叉查找树退化成链表的问题; 举例:如下,左边二叉排序树的左子树高度为2,右子树高度为0,二者的高度差为2,这是一棵非平衡二叉树;右边二叉树的左子树高度为1,右子树高度为2,二者的高度差为1,所以是一棵平衡二叉树。调整措施:左旋转、右旋转和左右双旋转;简而言之,就是更换根节点,使左右子树的高度差小于等于1;上图为使

2020-10-26 09:58:23 96

原创 [064] Java “二叉排序树”

1、二叉排序树概念:BST(Binary Sort Tree),二叉树的任何一个非叶子节点,左节点值 ≤当前节点值 ≤ 右节点值;

2020-10-22 09:46:08 138

原创 [063] Java “文件压缩及解压--哈夫曼编码”

1、写在前面文件的压缩原理与字符串压缩原理相同,都是用哈夫曼编码; 文件的压缩与解压涉及到输入输出流操作;2、Java代码 -- 文件的解压和压缩package DataStructures.Tree;import java.io.*;import java.util.*;/** * @author yhx * @date 2020/10/17 */public class HuffmanCode { /** * 生成哈夫曼树对应的哈夫曼编码 *

2020-10-20 15:28:46 173

原创 [062] Java “数据压缩及解压--哈夫曼编码”

1、哈夫曼编码Huffman Coding:是哈夫曼树在电讯通信领域的经典应用,被用于数据文件压缩,其压缩率在20%-90%之间,是可变字长编码(VLC)的一种,属于无损压缩; 固定长度编码:使用固定长度的符号编码,如使用8位二进制数进行编码的ASCII码就是最常用的定长编码;定长编码后的数据文件较大; 可变字长编码:根据字符在文件中的出现率大小分配不同长度的编码,出现几率高的字符使用较短的编码,反之亦然。这能使编码后的文件得到一定压缩,但可能使解码产生二义性; 哈夫曼编码是变长编码,但通过

2020-10-17 20:25:56 378 2

原创 [061] Java “哈夫曼树”

1、哈夫曼树Huffman Tree:给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。、 1、路径:在一棵树中,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径; 2、路径长度:路径分支(叉)的次数称为路径长度,则从根结点到第L层结点的路径长度为 L-1; 3、节点的权:节点被赋予的值; 4、带权路径长度:路径长度与节点权值的乘积; 5、树的带权路径:所有叶子节点的带权路径长度之和,记为WPL(weig

2020-10-17 20:21:28 117 1

原创 [060] Java “堆排序”

1、堆排序Heap Sort:利用堆这种数据结构而设计的一种排序算法,是选择排序的一种; 大顶堆:一棵完全二叉树,其每个结点的值都大于或等于其左右孩子结点的值; 小顶堆:一棵完全二叉树,其每个结点的值都小于或等于其左右孩子结点的值; 升序步骤: 将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点; 将其与末尾元素进行交换,此时末尾就为最大值; 然后将剩余 n-1个元素重新构造成一个堆,这样会得到n个元素的次大值; 如此反复执行,便能得到一个有序序列;

2020-10-16 14:21:50 94

原创 [059] Java “线索化二叉树”

1、线索化二叉树概念:上篇博文简介了顺序存储(数组)二叉树,相应的也有线索化(链表)二叉树。利用二叉树中的空指针域来存放在某种遍历次序下的前驱和后继,这种指针叫“线索”。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree); 通俗来讲:如下图的二叉树,它的中序遍历结果为 4 - 2 - 5 - 1 - 6 - 3,那 2 这个节点在中序遍历中的前驱就是4,后继节点就是5,但是单从二叉树中无法直接看出这个关系,因此,我们对原二叉树做一些小修改。我们都知道,n个节点的二叉树有2n

2020-10-15 15:49:46 89

原创 [058] Java “顺序存储二叉树”

1、顺序存储二叉树概念:即二叉树的顺序存储结构,更直白一点就是“使用数组存储二叉树”; 限制:只能是完全二叉树,否则要将普通二叉树转为完全二叉树,空缺的地方内容为空; 存储方式:从根节点开始,按照层次依次将树中节点存储到数组; 特点: 1、n:标识二叉树的第几个元素​​​​​​​,根节点为0; 2、第n个元素的左子节点编号为2*n+1。如上图的2号节点,它的左子节点编号为 2*2+1 = 5; 3、第n个元素的右子节点为2*n+2。如上图的1号节点,它的右子节点编...

2020-10-14 18:40:42 456 2

原创 [057] Java“二叉树”

1、二叉树Binary tree:一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树; 结点:包含一个数据元素及若干指向子树分支的信息; 度:一个结点拥有子树的数目称为结点的度; 叶子结点:也称为终端结点,没有子树的结点或者度为零的结点; 非叶子结点:度不为零的结点称为非终端结点; 层:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推; 树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度;

2020-10-14 12:59:16 76

原创 [056]Java“哈希表”

1、哈希表Hash Table:是一种“数组+链表”组合而成的数据结构,它同时具备数组和链表的优点 数组更利于元素的查找; 链表更利于元素的插入和删除; 在存储元素的时候,会用到“散列方法”,它的作用是将元素尽量均衡地分配到数组空间中,避免出现某个数组空间中的链表元素大大超过其它链表元素个数的情况; 比较常用的是取模散列法:index = value % arraySize,比如哈希表数组空间是5,那第7个元素在的位置就是7%5=2,即在下标为1的数组空间。2、Java代码//

2020-10-13 09:22:26 108

原创 [055] Java“斐波那契查找算法”

1、斐波那契查找算法Fibonacci Search:算法核心思想与二分法相同,只是mid点是黄金分割点; 黄金分割点是把一条线段分割成两个部分,使得一部分与全长之比等于另一部分与这一部分之比,取其前三位的近似值大概是0.618; 斐波那契数列{1,1,2,3,5,8,13,...}两个相邻数的比例无限接近0.618;2、Java代码package Algorithm.Search;import java.util.Arrays;/** * @author yhx * @date

2020-10-11 18:11:04 70

原创 [054] Java“插值查找算法”

1、插值查找算法Insert Value Search:是二分查找算法的改进版,二分查找的指针 mid 每次都只能折中取,插值查找算法对此做了一些改进,能根据待查找的数值对mid做自适应调整,从而加快查找速度。 步骤: 与二分法完全相同,只是 mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]); 2、Java代码package Algorithm.Search;import jav

2020-10-10 10:06:32 157

原创 [053] Java“二分查找算法”

1、二分查找Binary Search:又称为折半查找,相比于顺序遍历查找,使用二分查找算法的效率更高,但要求数组有序; 步骤: ① 确保数组有序,求得数组的中间值所在索引mid= (left+ right) / 2; ② 将中间值midVal与查找值searchVal比较,如果 midVal ==searchVal,说明找到结果,返回索引; ③ 如果 searchVal >midVal,就向右继续二分查找,即:将 mid+1 作为左边界,右边界不动,递归使用二分查找算法;...

2020-10-10 09:07:15 114

原创 [052] Java“基数排序算法”

1、基数排序Radix Sort:一种用空间换时间的排序算法,速度很快,但只能用于整数排序; 步骤: ① 定义10个桶,代表0~9这十个数; ② 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零; ③ 只看个位,对所有数执行放桶操作,完成第一轮排序; ④只看十位,对所有数执行放桶操作,完成第二轮排序; ⑤ ... ... ⑥ 多轮操作之后,数组就是有序的。 稳定性:稳定; 复杂度:O(n); 弊端:内存占用较大,对海量数据排序容易造成内存溢出。2、Ja...

2020-10-09 16:08:26 81

原创 [051] Java“归并排序算法”

1、归并排序Merge Sort:采用“分治法”思想的一种排序算法; 步骤: 分:将数组分成多级子序列; 合:逐级合并子序列,每次操作都保证合并后的组合序列有序; 稳定性:稳定; 复杂度:O(n log n) ,执行速度仅次于快速排序算法;2、Java代码package Algorithm.Sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;/**

2020-10-09 08:53:01 165

原创 [050] Java“快速排序算法”

1、快速排序quicksort:是对冒泡排序算法的改进,采用“分治法”,能实现对数据的快速排序; 步骤: 1、取基准:从数组中找一个基准值,这个基准值可随机取,一般就取最中间那个值; 2、交换:将小于基准的值放在基准的左边,将大于基准的值放在基准的右边; 3、递归:对左右两边的部分重复1-2步骤; 复杂度:O(N*logN); 稳定性:不稳定。2、Java代码package Algorithm.Sort;import java.text.SimpleDateFormat;

2020-10-05 12:00:19 70

原创 [049] Java“希尔排序算法”

1、希尔排序ShellSort:是“插入排序算法”的一种更高效的改进版本。插入排序的一大问题是,当插入的数是一个较小数时,需要移动的次数明显增加; 步骤:按数组下标的一定增量分组,对每组使用插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,最后进行一次插入排序后算法终止; 稳定性:虽然单次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳.

2020-10-04 10:50:02 61

原创 [048] Java“插入排序算法”

1、插入排序Insert Sort,最简单的排序算法之一; 步骤:假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程; 趟数:n 个数据的数组,选择排序需要排n-1 趟才能完成排序; 复杂度:平均时间复杂度为O(n^2); 稳定性:两个相等的数的相对顺序不会发生改变,则该算法是稳定的。所以插入排序是一种稳定算法。2、Java代码.

2020-09-30 11:47:11 140

原创 [047] Java“选择排序算法”

1、选择排序Select Sort,最简单的排序算法之一; 步骤:重复遍历数组(第一次从第一个位置开始,第二次从第二个位置开始),每遍历依次,都将该次遍历遇到的最小数放在数组的前端; 趟数:n 个数据的数组,选择排序需要排n-1 趟才能完成排序; 复杂度:平均时间复杂度为O(n^2),实际运行下来的时长比冒泡排序要短; 稳定性:选择排序的一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道.

2020-09-29 15:00:27 62

原创 [046] Java“冒泡排序算法”及优化

1、冒泡排序Bubble Sort,最简单的排序算法之一; 步骤:重复遍历数组,比较相邻元素,每一趟遍历都将此趟遇到的最大数放到数组后方; 趟数:n 个数据的数组,冒泡排序最多需要排序 n-1 趟才能完成排序(未优化的); 复杂度:平均时间复杂度为O(n^2); 稳定性:冒泡排序中,如果两个元素相等,是不会再交换的,所以冒泡排序是一种稳定排序算法。2、Java代码package Algorithm.Sort;import java.text.SimpleDateFormat;imp

2020-09-29 09:26:17 79

原创 [045] 递归解决“八皇后问题”

1、八皇后问题 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 2、Java代码package Algorithm.Recursion;/** * @author yhx * @date 2020/09/28 */public class Queue8 { /** * max:共有多少个皇后 * array:每个皇后的位置,例如array[2]=4,表示第3个皇后在棋盘第3行第

2020-09-28 09:52:00 73

原创 [044] 使用List和Stack实现综合计算器(后缀--逆波兰表达式)

1、后缀表达式中缀表达式如(3+4)*5-6是我们人类在书写数学表达式时最长使用的一种书写方式,但对于计算机来说,后缀表达式(又称为逆波兰表达式)更利于计算。中缀表达式: (3+4)*5-6 -> 后缀表达式(逆波兰表达式):3 4 + 5 * 6 - 中缀表达式:4*5-8+60+8/2 -> 后缀表达式(逆波兰表达式):4 5 * 8 - 60 + 8 2 / +后缀计算器的设计步骤如下:将中缀表达式String转为中缀表达式List; 将中缀表达式List转为后缀表达式L

2020-09-21 18:53:10 329

原创 [043] 使用栈实现综合计算器(中缀)

1、实现思路创建两个栈:数据栈(numStack)和符号栈(operStack); 通过index索引来遍历表达式; 如果扫描到的是数字,就直接入栈。不能扫描到一个数就立刻入栈,因为它可能是多位数。需向expression表达式的index后看一位,如果是数就继续后移扫描,直到扫到符号才入栈; 如果扫描到的是操作符,则需要分情况考虑: 如果发现当前的符号栈为空,就直接入栈; 如果符号栈有操作符,就进行比较:① 如果当前操作符的优先级小于等于栈顶操作符,就从数据栈中pop出两个数据,从符号栈中p

2020-09-18 16:49:49 240

原创 [042] 环形链表(Circle Single Linked List)和“约瑟夫(Josephu)问题”

1、约瑟夫问题(丢手绢问题):N个小孩围成一个圈,标号为1到N; 从编号为m的小孩开始报数,报到第k(1 <= k <= n)个小孩时,该小孩退出游戏; 然后下一个小孩继续从1开始报数,数到第k个小孩时,该小孩退出游戏; 如此循环,剩下最后一个小孩是胜利者。2、JAVA代码package DataStructures.LinkedList;/** * @author yhx * @date 2020/09/16 */public class Josephu {

2020-09-17 13:49:24 128

原创 [041] 双链表(double linked list)的“增删改查”

1、双链表相对单链表,双链表多了一个指针域pre,使得相邻的两个节点可以互相指向。其构成如下:指针域pre:指向当前节点的上一个节点; 指针域next:指向当前节点的下一个节点; 数据域:存放数据。双向链表相对单项链表的优点为:单向链表的查找只能是一个方向,但双向链表可以向前或向后查找; 单向链表不能自我删除,需要辅助节点temp(需删除节点的前一个节点);双向链表可以自我删除2、代码package DataStructures;/** * @author yhx * @

2020-09-15 19:39:51 92

原创 [040] 单链表(single linked list)的“增删改查”,反转,逆序打印

1、链表概念:链表是以节点的方式链式存储的; 每个节点包含data域(存储数据),next域(指向下一节点的地址); 链表的各个节点不一定是连续存储的,地址可能存在跳跃; 链表分为:带头节点的链表和没有头节点的链表,根据实际需求来确定。增(法1,按照添加顺序添加):找到当前链表的最后一个节点; 将最后这个节点的next指向新的节点。增(法2,按照编号顺序添加):首先找到新添加节点要添加到的位置:通过辅助temp变量(指针),通过遍历搞定 ; 新节点.next = temp.ne

2020-09-11 14:24:47 209

原创 [039] 数组队列(Array Queue)及数组环形队列(Circle Array Queue)

1、队列概念:队列是一个有序列表,可以用数组或链表来实现;例如银行排队系统,就是队列的应用; 遵循先入先出的原则。 如果用数组来存储队列的数据,则用maxSize来表示队列的最大容量,用front和rear来表示队列前后端的下标,front会随着数据输出而改变,rear会随着数据输入而改变。2、数组队列/* 本文件:用数组创建队列。 */package DataStructures;import java.util.Scanner;public class ArrQueue {

2020-09-09 15:44:49 206

原创 [038] 稀疏数组 SparseArr

1、概念:原数组中存在大量的无效数据,可以做压缩处理,稀疏数组是一种压缩后的数组。2、二维数组 转 稀疏数组的思路① 遍历原始数组,得到有效数据的个数sum;② 根据sum可以创建稀疏数组SparseArr int [sum+1][3];③ 将二维数组的有效数据存入到稀疏数组;3、稀疏数组 转 二维数组的思路① 先读取稀疏数组的第一行,创建原始的二维数组;② 再读取稀疏数组的后几行数据,赋值给二维数组即可;参考链接4、Java代码(创建二维数组,转为稀疏数组,再转为原始数组

2020-09-09 08:50:17 101

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除