数据结构与算法
风中有朵雨做的云yi
没吃过学习的苦,就必须得吃生活的苦.
展开
-
数据结构与算法(35):骑士周游问题(马踏棋盘算法相关实现代码)
马踏棋盘算法介绍和游戏演示马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格骑士周游问题的解决思路创建棋盘chessBoard,是一个二维数组将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(arrayList),最多有8个位置,每走一步,就是用step+1遍历arrayList中存放的所有位置看看.原创 2020-10-21 18:06:42 · 646 阅读 · 0 评论 -
数据结构与算法(33):迪杰斯特拉算法(迪杰斯特拉介绍及其最短路径问题相关实例代码)
应用场景-最短路径问题看一个应用场景和问题:战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何计算出G村庄到 其它各个村庄的最短距离?如果从其它点出发到各个点的最短距离又是多少?...原创 2020-10-21 15:46:09 · 381 阅读 · 0 评论 -
数据结构与算法(32):克鲁斯卡尔算法(介绍,最小生成树相关实例及其代码实现)
看一个应用场景和问题:某城市新增7个站点(A, B, C, D, E, F, G) ,现在需要修路把7个站点连通各个站点的距离用边线表示(权) ,比如 A – B 距离 12公里问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短?克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入.原创 2020-10-20 16:47:08 · 325 阅读 · 0 评论 -
数据结构与算法(31):普里姆算法(介绍,相关应用场景的实例修路问题代码实现)
应用场景-修路问题看一个应用场景和问题:(1)有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路分析: 将10条边,连接即可,但是总的里程数不是最小.正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少.进而引出一个概念最小生成树修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树(.原创 2020-10-20 15:20:15 · 1001 阅读 · 0 评论 -
数据结构与算法(30): 贪心算法简介(相关实例集合覆盖问题及其代码实现)
贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果抛出实际案例应用场景-集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号广播台覆盖地区k1“北京”, “上海”, “天津”.原创 2020-10-20 11:07:13 · 736 阅读 · 0 评论 -
数据结构与算法(29):KMP算法(核心思想分析)及其相关应用实例(与暴力字符串匹配代码实现)
应用场景-字符串匹配问题字符串匹配问题::有一个字符串 str1= ““陈骁聪 陈骁聪你陈骁 陈骁聪你陈骁聪你陈骁你好””,和一个子串 str2=“陈骁聪你陈骁你”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1KMP算法暴力匹配算法如果用暴力匹配的思路,并假设现在str1匹配到 i 位置,子串str2匹配到 j 位置,则有:如果当前字符匹配成功(即str1[i] == str2[j]),则i++,j++,继续匹配下一个字符.原创 2020-10-19 17:01:51 · 343 阅读 · 1 评论 -
数据结构与算法(28):分治算法,动态规划算法(0-1背包问题代码实现,思路分析)
分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表汉诺塔分治算法的基本步骤分治法在每层的递归上都有三个.原创 2020-10-19 15:33:35 · 1574 阅读 · 0 评论 -
数据结构与算法(27):图的基本介绍(图的深度优先遍历,图的广度优先遍历)以及相关的案例代码
一. 图的基本介绍为什么要有图?回顾一下线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:无向图2. 有向图3. 带权图图的表示方式图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于原创 2020-10-15 17:35:34 · 540 阅读 · 0 评论 -
数据结构与算法(26):多路查找路(二叉树 和B树,B+ ,B* 问题分析)
一 . 二叉树和B树的问题分析二叉树的操作效率较高,但是也存在问题二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.引出了一个多叉树的概念在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(mult原创 2020-10-15 16:15:34 · 173 阅读 · 0 评论 -
数据结构与算法(25):平衡二叉树(AVL树 左旋转,右旋转 双旋转)介绍及其相关案例
一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在BST 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)平衡二叉树基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特点原创 2020-10-14 16:13:25 · 714 阅读 · 1 评论 -
数据结构与算法(24):二叉排序树(增删查改)及其相关案例
先看一个小例子给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。你会怎么做呢?解决方案分析使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。使用二叉排序树二叉排序树介原创 2020-10-14 11:29:47 · 919 阅读 · 1 评论 -
数据结构与算法(23):树结构实际应用之赫夫曼树(赫夫曼树,数据压缩和解压代码演示)
一 . 赫夫曼树的基本介绍给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树赫夫曼树是带权路径长度最短的树,权值较大的结点离根比较近赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个原创 2020-10-13 17:15:17 · 594 阅读 · 0 评论 -
数据结构与算法(22):堆排序(二叉树)及其相关案例
1.堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogN),它是一种不稳定的排序堆是具有以下性质的完全二叉树,每个节点的值都大于或者等于其左右孩子节点的值称为大顶堆.**注意:**没有要求节点的左孩子和右孩子的大小关系每个结点的值都小于或等于其左右孩子节点的值,称为小顶堆大顶堆举例说明我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子:大顶堆特点:arr[i] >= arr[2i+1] &am原创 2020-10-12 11:00:45 · 425 阅读 · 0 评论 -
数据结构与算法(21):顺序存储二叉树及其线索二叉树相关用例
一.顺序存储二叉树的概念基本说明从数据存储来看,数据存储的方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组顺序存储二叉树的特点顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n+1第n个元素的父节点为2*n+2第n个元素的父节点为(n-1)/2示范例:要求:右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历原创 2020-10-10 16:44:49 · 160 阅读 · 0 评论 -
数据结构与算法(20):树结构基础部分及其(二叉树代码增删查改实现)相关用例
一.为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快,对于有序数组可以使用二分查找提高检索速度缺点: 如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低对数组添加元素,底层就是一个数组扩容操作:先拷贝原来的数组,再加入新的元素.ArrayList底层维护了数组object[]...原创 2020-10-09 15:12:47 · 321 阅读 · 0 评论 -
数据结构与算法(19):哈希表介绍及其相关用例
一.哈希表的介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。为什么要使用哈希表哈希表的结构:哈希表属于一种数据结构不是算法.代码实现:package com.qiu.hashtable;import java.util.Scanner;public class HashTableDemo {原创 2020-10-08 13:54:02 · 472 阅读 · 0 评论 -
数据结构与算法(18):查找算法(顺序查找,二分查找,二分查找优化,插值查找,斐波那契查找)介绍及其应用实例
一. 查找算法介绍顺序(线性)查找二分查找/折半查找插值查找斐波那契查找顺序查找代码展示:package com.qiu.search;public class SeqSearch { public static void main(String[] args) { int[] arr = {1,211,54,84,56}; int index = seqSearch(arr,211); if (index == -1){ Syste原创 2020-10-08 10:59:22 · 363 阅读 · 0 评论 -
数据结构与算法(17):基数排序及其应用实例
一. 基数排序(桶排序)介绍基数排序(radix sort)属于分配式排序,又被称为桶子法,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用基数排序法属于稳定的排序,基数排序法的是效率高的稳定性排序法基数排序是桶排序的扩展基数排序是1887年赫尔曼发明的,它的实现:将是整数按位数切割成不同的数字,然后按每个位数分别比较二. 基数排序的基本思想 将所有待比较数值统一为同样的数位长度,数为较短的数前面补零,然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高为原创 2020-10-07 11:41:07 · 1001 阅读 · 0 评论 -
数据结构与算法(16):归并排序:及其相关的用例
一.归并排序 是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各个答案修补在一起,即分而治之)分得过程中,将每个元素拆分出来,通过合并,将其排序,最核心的部分在于治.解释上图操作(这里将的是治这个阶段,讲解下最后一次合并):定义了一个i,j分别指向两个有序的子序列的最前面,将i,j指向的数据做比较,将最小的那个数据指向temp数组,也就是临时数组如果上述中是i最小,第二次就将i右移一次.假如说是j最小,同样的将j原创 2020-10-07 10:20:36 · 238 阅读 · 0 评论 -
数据结构与算法(15):快速排序讲解及其实例演示
一:快速排序的介绍 快速排序是对冒泡排序的一种改进,其基本思想就是通过一趟排序,将要排序的数据分割成两个独立的部分,其中的一部分的所有数据都比另一部分要小,然后按照此方法对这两个部分数据进行快速排序,整个排序过程可以递归进行,以此让整个数据达到一个有序序列下面进行一个思路的分析过程对 [-9,78,0,23,-567,70] 进行分析找到下标中间的值.也就是这个数组中的0从左边开始找,找到78比0大,再从右边开始找,找到一个-567比0小的数,所以可以进行交换交换过后:[-9,-567,0原创 2020-10-01 22:48:42 · 754 阅读 · 0 评论 -
数据结构与算法(14):希尔排序及其实例讲解
在上一个关于算法的博客中我们谈到了插入排序,从时间复杂度来说确实会比冒泡好的太多,但是插入排序是会存在问题的,首先我们看下一个简单的插入排序,进行问题复现举例:数组arr ={2,3,4,5,6,1 } 当需要插入的数最小为1时,插入排序的过程是:{2,3,4,5,6,6} ->{2,3,4,5,5,6} ->{2,3,4,4,5,6} ->{2,3,3,4,5,6} ->{2,2,3,4,5,6} ->{1,2,3,4,5,6}.我们最终会发现当需要插入的数原创 2020-09-23 14:13:02 · 7754 阅读 · 0 评论 -
数据结构与算法(13):插入排序(介绍,实例,推导代码)
一:插入排序插入排序算法的介绍:插入法排序属于内部排序法,是对于预排序的元素以插入的方式找寻该元素的适当位置,然后达到排序的目的插入排序的基本思想插入排序的基本思想:把N个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码,依次与有序表的元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表.**理解:**从无序表中每次挑出一个元素,并在有序表中进行排序二:插入排序的应用实例原创 2020-09-17 19:39:03 · 215 阅读 · 0 评论 -
数据结构与算法(12):选择排序(含相关的实例)
一:选择排序基本介绍 选择式排序也属于内部排序法,是从待排序的数据中,按照指定的规则选出某一元素,再依规定交换位置后达到排序的目的选择排序思想:选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~arr[n-1]中选取原创 2020-09-16 18:44:59 · 481 阅读 · 0 评论 -
数据结构与算法(11):冒泡排序(应用实例分析)
一:冒泡排序的基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)我们举一个具体的案例来说明冒泡法。我原创 2020-09-16 10:47:41 · 1637 阅读 · 0 评论 -
数据结构与算法(10):算法的时间复杂度
一:时间频度的基本介绍 一个算法花费的时间与算法中语句的执行次数成正比例,哪一算法中语句回字形的次数越多,它的时间花费的就越多,一个算法中的语句执行次数称为语句频度或者时间频度,即为T(n)比如说:计算1-100所有的数字之和二:算法的时间复杂度结论:2n^2+3n+10 和 2n^2 随着n 变大, 执行曲线无限接近, 可以忽略 3n+10n^2+5n+20 和 n^2 随着n 变大,执行曲线无限接近, 可以忽略 5n+20结论:随着n值变大,5n^2+7n 和 3n^2 +原创 2020-09-16 09:30:29 · 636 阅读 · 0 评论 -
数据结构与算法(9):递归问题(打印问题,阶乘问题,迷宫小案例,八皇后问题)
一:递归的概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁.打印问题阶乘问题二:递归调用的规则1.当程序执行到一个方法时,就会开辟一个独立的空间(栈)然后执行到了test(3)不会直接执行结果,而是继续的开辟一个新的栈…这个时候的if条件不成立,再出来执行输出语句,由于在n=2时才执行输出,然后执行n=2执行完了后,n=2的栈就没了,然后再执行n=3的栈,同理一直向下执行,直到主方法执行完毕之后,直接退出程序.原创 2020-09-15 19:31:46 · 202 阅读 · 0 评论 -
数据结构与算法(8):前缀表达式(波兰表达式),中缀表达式,后缀表达式(逆波兰表达式:实例逆波兰计算器)
一:前缀表达式的计算机求值 从右到左扫描表达式,遇到了数字,就将数字压入堆栈,遇到运算符就将运算符压入堆栈,弹出栈顶的两个数,用运算符对他们做相应的计算.(栈顶元素,和次顶元素).并将结果入栈,接着重复上述的过程指导表达式的最左端,最后运算得出的值即为表达式的结果举个例子:(3+4)*5-6对应的前缀表达式就是-*+3456,针对前缀表达式求值步骤如下:从右到左进行扫描,将6543依次压入栈中遇到+运算符后弹出3和4(3为栈顶一个元素,4为次顶元素),计算出3+4的值后,得到的7压入栈中.接下原创 2020-09-14 19:27:23 · 1156 阅读 · 0 评论 -
数据结构与算法(7):栈的介绍以及相关的实例应用(数组模拟栈,链表模拟栈,栈实现综合计算器(中缀表达式))
一:栈的介绍栈的英文为(stack)栈是一种先入后出的有序列表栈是限制线性表中的元素的插入和删除只能在线性表中的一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底.根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素正好相反,最后放入的元素最先删除,最先放入的元素最后删除.二:栈的应用场景子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完后将地址取出,以便恢复到原来的程序中处理递归调用:原创 2020-09-14 09:27:01 · 210 阅读 · 0 评论 -
数据结构与算法(6):单向环形链表的应用场景(josephu问题)
一:(约瑟夫环)问题n个人围成一个圈,指定一个数字n,从第一个人开始报数,每轮报到m的选手出局,由下一个人接着从头开始报,最后一个人是赢家。其中m>1,n>2。我们可以发现这是一个闭合的换,符合单向环形问题思路分析:假如说我有五个人,n=5,k=1,m=2.就是说数2下的话,出队编号就是:如图:首先就是2出队列,如下图接着4号出队列:接着1号开始出队列:再接着5号出列;最后一号出列:这样的话出队列的顺序就会变成2->4->1->5->3然后根据原创 2020-09-13 10:24:44 · 447 阅读 · 0 评论 -
数据结构与算法(5):双向链表的遍历,增加,删除修改(代码演示)
一:什么是双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 通俗的说就是一个双向链表中除了有每个节点包含的信息外,还多说两个指针,第一个为pre,指向前一个节点,第二个为next,指向后一个节点二:有关双向链表的操作双向链表的遍历 遍历双向链表和之前我写的单链表一样,唯一不同的就是双向链表可以往前查找,也可以往后查找2原创 2020-09-12 19:21:11 · 1643 阅读 · 0 评论 -
数据结构与算法(4):单链表面试题:(1.查找有效节点2.查找单链表中的倒数第K个节点3.单链表的反转4.从尾到头打印单链表(要求方式:反向遍历,方式二:Stack栈)5.合并两个单链表,使之有序)
单链表的常见面试题有如下:1.求单链表中有效节点的个数**思路:**查找有效节点的个数,首先想到的就是遍历这个链表代码演示://head 为头结点 public static int getLength(StudentNode head){ if (head.next == null){ //说明这是一个空链表 return 0; } int length =0; //定义了一原创 2020-09-12 15:31:41 · 360 阅读 · 0 评论 -
数据结构与算法(3):单链表的创建删除修改以及应用实例
一:什么是链表?链表是一个有序得列表,但是链表在内存中并不是连续存储的小总结:1.链表是以节点的方式来存储的,为链式存储.2.每个节点包括了一个data域,一个next域:指向下一个节点3.链表中的各个节点不一定是顺序存储的4.链表分为带头的节点和不带头的节点5.单链表的逻辑结构如下图所示二:带头节点的单向链表实现:实例:同学的排名,姓名,班级.第一种方法:添加同学信息时,直接添加到链表的尾部第二种方法:添加同学信息时,根据同学的排名,插入添加.起始代码实现:...原创 2020-09-10 11:19:19 · 347 阅读 · 0 评论 -
数据结构与算法(2):用数组模拟队列,用算法模拟环形数组
一: 什么是队列?1):队列是一个有序列表,可以用数组或者是链表来实现.2):队列遵循先进先出的原则,即:先存入队列的数据,要先取出,后存入队列的数据要后取出.如图所示:二.用数组模拟队列的思路1.队列本身就是一个有序的列表如果说是使用数组的结构来存储队列的数据,那么如上图所示,其中的maxSize表示为该队列的最大容量2.由于用数组表示队列,那么队列的输出输入都是从前后端来实现的,所以我们创建了两个变量,front和rear,front表示这个模拟队列的前后端的下标,其中front用来表示输原创 2020-09-09 10:46:37 · 175 阅读 · 0 评论 -
java数据结构和算法(1):二维数组与稀疏数组的转换
这里首先提出一个实际的例子:五子棋程序.在五子棋中,两个人下完棋之后可以将下好的棋存在文件中,或者说因突然有事,两个人无法继续下五子棋,这个时候就需要将五子棋下的位置记录起来存到文件中去. 如何存储五子棋盘?这里我们可以用到二维数组,没下的点可以用0表示,下的白棋用1表示,下的黑棋可以用2,表示.:如上图所示:有一个明显的问题,如何说存放的0太多了,这样就没有了意义.所以我们需要想一个办法,如何将该存储五子棋盘做一个优化,这个时候提出了另外一个数组, 稀疏数组. 在稀疏数组中,我们可以存放有用原创 2020-09-09 08:38:11 · 235 阅读 · 0 评论