自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 python实现九九乘法表

while嵌套循环及for嵌套循环实现九九乘法表

2024-06-09 19:02:31 237

原创 供应链总销售额 Java,c++题解 (求叶子结点权值总和,dfs,bfs,dfs记忆化搜索)【PAT甲级1079】

求根结点到叶子结点的总权值,用dfs深搜可以递归当前结点的儿子,直到遇到叶子结点时累加权值,但Java的dfs有两个测试点过不去,同样的思路换成c++直接AC;bfs可以在出队时判断是否为叶子结点,并将权值累加;用dfs记忆化搜索当前结点的深度,递归时将搜到的结果都保存下来,最后遍历叶子结点将权值累加。

2022-04-21 21:02:57 1173

原创 最大的一代 Java代码 (求树中结点数最多的一层的结点数量,dfs,bfs)【PAT甲级1094】

求树中结点数量最多的一层,可以用深搜,传入两个参数:根结点,深度。每次递归根结点的儿子,并将这层的结点数加一,最后遍历各个深度找最大的结点的数量;也可以用宽搜:每次遍历只遍历一层,一层遍历完再将这层的所有儿子加入队列,记录每层结点数量的最大值,直到都遍历完。

2022-04-21 16:25:17 557

原创 等重路径 Java代码 (求树中从根结点到叶子的权值,bfs,dfs)【PAT甲级1053】

求从根结点到叶子结点的总权值,可以用深搜,不断递归搜索儿子结点,当递归到叶子时,判断当前的权值总和,并将此时的路径保存,回溯时再恢复到前一步的状态。宽搜时,先将从根结点到每个结点的权值记录下来,同时记录路径,再遍历这些点的权值,找权值等于s的并且是叶子结点的权值,最后输出。

2022-04-21 14:57:01 580

原创 顶点着色 Java题解 (图,模拟)【PAT甲级1154】

判断图的任意两点是否染色相同,只需要遍历所有的图的边,判断是否有两端点的值相同。

2022-04-20 23:02:18 546 1

原创 拓扑顺序 Java代码(判断拓扑序列的合法性)【PAT甲级1146】

拓扑序列是在有向无环图中的任意一条边的两点,在序列中始终是从前指向后的。所以在判断拓扑序列时,只需要遍历所有的边,检查是否在序列中满足从前指向后。由于拓扑序列的最开始的顶点入度一定为0,也可以检查序列的入度情况,并将以该顶点的出度为入度的顶点入度减去,判断序列的入度是否始终未为0。

2022-04-20 20:36:00 770

原创 最大团 Java题解 (团,模拟)【PAT甲级1142】

根据题意模拟:给定点集中有不相连的边,则不是团;是团时,点集外的点存在有某点与团内所有点都有边,则不是最大团,否则是最大团。时间复杂度为 O(n·n·m),最坏为 4·10^6

2022-04-20 18:34:50 446

原创 顶点覆盖 Java题解 (模拟)【PAT甲级1134】

要判断所给出的点是否可以覆盖所有边的顶点,可以按这种要求模拟,将每次询问的所有点都遍历它所接壤的边,判断总边数是否被这些顶点都覆盖了,但这种时间复杂度很大,达到O(k·n·n),最坏10^10,直接超时。但是如果反过来考虑,判断所有的边的两点是否在给定的一行询问中都存在,直接遍历边即可,时间复杂度为O(k·n),最坏10^6,不会超时。在储存边时,因为程序中只是用到到了两边的顶点,并没有要求将边相连,或者遍历边,所以并不需要将边以邻接表存储,可以只用一个类存储所有边的顶点即可。

2022-04-20 12:16:32 580

原创 欧拉路径 Java题解 (图的遍历,判断连通块)【PAT甲级1126】

要判断是哪种图,首先要判断图中的点是否是相通的,即是否是一个连通块,判断连通块可以用dfs,bfs,并查集判断,用dfs又可以通过不断递归找出连通块中的总个数(每次递归将当前的数量加1并返回),判断度数只要在输入时处理即可。dfs可以通过,但bfs不知道为啥竟为超时???

2022-04-19 21:03:09 216

原创 L2-031 深入虎穴 (25 分) Java题解 (树的最大深度dfs,bfs)

找最大深度的编号,由于答案唯一,所以宽搜到的最后一个结点就是bfs扩展最远的点;也可以深搜,通过递归左右儿子更新最大深度时更新结点编号,但dfs有两个点没过,找不出原因。

2022-04-19 16:41:30 604 1

原创 Z 字形遍历二叉树 Java题解(树的各层结点数,树的深度,bfs)【PAT甲级1127】

因为结点权值均不同,可以用map存储各结点的左右儿子,构造出二叉树。再通过层序遍历,将奇数层的序列翻转,偶数层的不变,最后输出结果。控制遍历到哪一层时,可以通过两个while循环:当内层while循环完时,表明一层结束,再统一将这一层的左右儿子入队,从而控制层数。也可以先深搜出各层的结点数,while循环内通过for控制队列的出队元素数。

2022-04-19 12:59:57 263

原创 后序遍历 Java题解 (前序+中序求后序)【PAT甲级1138】

通过递归找到第一次后序遍历到的位置,输出第一个答案后直接退出程序。但第四个测试点始终过不去,既不超时也不超限,答案错误。。。

2022-04-18 23:34:15 286

原创 完全二叉树 Java题解 (给定树判断是否为CBT)【PAT甲级1110】

判断一棵树是否为完全二叉树,可以从完全二叉树的性质判断:除了最后一层外,其余层都没有空缺,即当把n个结点填充到完全二叉树中,最后一个结点的编号一定是n。可以假定当前树是一颗完全二叉树,通过比较树中最大结点编号是否与结点总数相等来判断是否合法。代码实现:可以在遍历树时,传入一个参数k,表示当前结点在完全二叉树中的编号,通过更新k求最大编号,传入左儿子时,编号乘以2.右儿子时乘以2加1。

2022-04-18 18:40:36 147

原创 反转二叉树 Java代码 (二叉树,中序遍历,层序遍历)【PAT甲级1102】

要将二叉树翻转,可以先按题意建好树,再递归将每个结点的左右结点都交换,也可以再输入时就直接交换。还需要通过“入度”确定根结点,最后通过dfs中序遍历,bfs层序遍历。

2022-04-18 16:42:03 279

原创 构建二叉搜索树 Java代码 (中序遍历,dfs,bfs)【PAT甲级1099】

先按给出的方式构造出树,要想使给定的数满足二叉搜索树,由于二叉搜索树的中序遍历为递增的有序序列,所以将给定的权值先递增排序,在对树中序遍历时,将权值记录。最后通过宽搜输出层序遍历。

2022-04-18 15:42:34 295

原创 再次树遍历 Java代码 (前序+中序求后序)【PAT甲级1086】

一种规律是:第一个操作一定是push操作,且这个元素一定就是根结点;从第二个操作起,当上个操作为push时,则当前push进的元素为上个push的元素的左儿子,当上步操作为pop时,当前push进的元素就是pop出的元素的右儿子。所以通过模拟记录每个结点的左右儿子,从而构造出树,最后遍历树得到后序序列。另一种规律是:push的序列实际上就是前序遍历的结果,而pop出的元素序列就是中序遍历的结果,从而转化成通过前序+中序求后序的问题。

2022-04-18 14:17:26 254

原创 完全二叉搜索树 Java代码 (构造二叉树)【PAT甲级真题1064】

完全二叉树定义:除了树的最后一层权值没有达到最大值外,其余层都为最大值。完全二叉树的存储:可以用一维数组存储,由于给定任意一个结点x,都可以求出他的左儿子:2x,右儿子 2x+1,所以默认二叉树的根结点为1号索引(避免0乘以任何数都为0造成死递归)。要想使得完全二叉搜索树,还需要满足二叉搜索树的性质:即完全二叉搜索树的中序遍历为递增的有序序列,所以在用结点填充数组时,先提前保证数组有序。

2022-04-18 11:25:49 442

原创 学生课程列表 Java题解 (map,set)【PAT甲级1039】

将每个学生的String与他对应的的所有课程存入map中,姓名对应key,所有课程对应value;所有的课程用TreeSet存储,实现自动升序,最后查找map输出。最后一个测试点内存超限了。

2022-04-18 09:49:24 248

原创 判断二叉搜索树 Java代码 (中序+前序求后序,镜像)【PAT甲级1043】

给定前序和中序求后序,主要是找根结点在中序序列中的位置,从而不断递归分割中序序列,而前序序列中根结点就是该序列的第一个位置。给定二叉搜索树(BST)的前序序列,相当于同时给定了前序+中序,因为二叉搜索树的中序遍历就是从小到大递增的顺序,题目限定了左子树是严格小于根结点的,所以当排序后若出现两个权值相等时的结点,要选第一次出现的点,确保之后的点都在它的右子树上。

2022-04-18 08:12:30 389

原创 最深的根 Java题解 (求连通块数量,无向图树的深度,dfs,bfs)【PAT甲级1021】

先判断给定的结点是否为树,当可以是树时,图中一定只有一个连通块,并且输入给出了n个点,n-1条边,所以这唯一的连通块一定是无环连通图,即树。判断连通块个数:宽搜,每搜一次,将扩展到的点都做标记,当搜完某个点后,如果图中剩余的点都被标记过,说明是联通的,否则不是。满足树时,还需要确定根结点,但是因为两两边都是无向边,所以根结点无法确定,可以将所有顶点都视为根结点,深搜判断树的最大深度:无向边需要记录父结点,防止遍历的倒回去。宽搜求树的树的最大深度:将树的每条边都看作权值为一,找可以扩展到的最大距离。

2022-04-17 00:43:53 472

原创 L2-038 病毒溯源 (25 分) Java题解 (树的深度,dfs,记录路径)

求树的从根节点开始的最长的路径,只要找到根结点的所有儿子结点为根结点的最长路径即可,找到时,记录该结点的儿子结点,两个二子结点路径相等时,找最小结点号的儿子,最后输出路径。

2022-04-16 22:24:40 773 1

原创 L2-4 哲哲打游戏 Java题解 (图,模拟)

​这道题题意有点难懂,不认真读看完也不知道到说了个啥意思。。意思是做某个操作或选择可以走到这个顶点的第某个邻接边上,对图的存储可以用数组模拟邻接表,集合式的二维数组存储图,数组套集合存储图,其中将数组套进集合中速度最快,内存最少。另外再读取数据时,如果仅仅用bufferedreader,可能会因为中间产生大量字符串而导致内存超限,对于这种仅仅涉及整型数据的读取可以用streamtokenizer快读,效率很高。​

2022-04-16 20:39:54 2469

原创 Java快速读取----StreamTokenizer

提前将读取对象设置成静态的,将读取写成方法,方便调取。适用于读取超大规模整型数据时使用。

2022-04-16 19:18:11 703

原创 L2-036 网红点打卡攻略 (25 分) Java题解 (图,模拟)

题意大致是给出若干个序列,判断合法序列数,合法条件为序列中的点在图中正好都只出现过一次,并且相邻两点都有通路。从0号点开始,遍历完景点,再回到0号点,输出合法条数和最小权值即可。

2022-04-16 15:31:25 317 1

原创 哈密顿回路 Java题解 (图,模拟)【PAT甲级1122】

满足哈密顿回路的条件是:相邻两点都有边相连,每个点只能遍历一次,图中所有的点都遍历过。

2022-04-16 13:21:23 505

原创 在线地图 Java题解 (dilkstra求最短路)【PAT甲级1111】

求最短距离和最快时间都可以等价于为最短路,在最短路的情况下按多关键字排序。距离相等时,取时间最少;时间相等时,取结点数最少。可以分别写一次dijkstra,代码较长,也可以只写一次,对关键字的权值特判,代码稍短。

2022-04-16 12:27:26 301

原创 树的遍历 Java代码 (中序和后序构建树)【PAT甲级1020】

构建的方式:通过中序序列和后序序列可以唯一确定一颗二叉树,这是因为后序序列的最后一个值便是根结点 t ,而这个根结点将中序序列又分成了左右两部分,中序遍历的左右两部分加上后序遍历的左右两部分又可以分别确定两棵树,这两棵树又能确定两个根结点,即 t 的左右子树的根结点,依此递归下去,直到不能再划分为止。

2022-04-15 20:55:27 265

原创 数叶子结点 Java题解 (dfs) 【PAT甲级1004】

递归终止条件:到达叶子结点,不能再递归,不是叶子结点时,一直递归直到成为叶子结点。满足题意条件:每层的叶子结点总和,递归的深度就是层数,通过传入深度的参数记录每层的叶子数。

2022-04-15 17:31:12 252

原创 1499. 数字图书馆 Java题解 (map,set)【PAT甲级1022】

map + set:将每本书的每条信息分别与id存入map中,map的value中存储着满足该信息的所有id的集合。查找时直接在各信息的map中查找并加入set,代码冗余大,较省时。类+set:将每本书的所有信息都存入类中,查找信息时,遍历所有的书,从中找符合条件的id加入set中,代码冗余小,稍耗时。存id时,直接放入TreeSet中,自动为字符串按升序存放。

2022-04-15 13:21:46 98

原创 1484. 最佳排名 Java题解 (二分,map,排序)【PAT甲级1012】

数据存储:对学生信息的存储:用map。其中key存储学生的姓名,value用list存放该学生的四课成绩。对每科成绩的存储,用二维数组,二维数组的每行存储每科的所有成绩。查找方式:当对每课成绩都排序后,二分查找每个学生的每科成绩在该科成绩数组中的位置。找到名次后,取最小名次并作记录。

2022-04-15 10:41:38 654

原创 1577. 条条大路通罗马 Java题解 (dijkstra综合应用,map)【PAT甲级1087】

这道题求了最短路大小,最短路条数,最大点权和,最少点数,路径的打印。在dijkstra的更新距离时,依次处理,不重不漏。对图中结点的处理:由于图中的顶点不是以标号的形式给出,需要先将字符串与标号一一映射,通过下标简化处理。

2022-04-14 18:08:58 1102

原创 1507. 旅行计划 Java代码 (dijkstra求最短路路径和边权最小和)【PAT甲级1030】

在dijkstra更新最短距离时,每更新一次距离,就修改pre数组值,并且修改花费;当原距离与待更新距离相等时,需要对比花费,当花费更小时需要更新,并记录pre数组值。

2022-04-14 14:17:54 292

原创 1475. 紧急情况 Java题解 (dijkstra求最短路条数和点权和)【PAT甲级1003】

求最短路条数和点权和最大值均是在dijkstra的更新距离时处理,因为更新距离时所求的就是最短路。当更新的时,当前距离与更新后的距离相等,说明最短路不唯一,最短路的条数就从此处更新变化,将两边的最短路的条数累加起来,点权和取相等这两条路中最大一边的点权和;当前距离比更新后的距离大时,则需要更新,最短路的条数为更新后的值,点权和最大值发生变化。

2022-04-14 12:23:49 272

原创 854. Floyd求最短路 Java代码

dis[i][j]表示从i到j的距离,floyd在更新时,借助第三点k,取 min( dis[i][j] , dis[i][k] + dis[k][j]),即i到j的距离取决于选第k个点或不选第k个点时的最小值,而k由k-1决定,所以需要将k放到最外层。dis的初始化时,自环为0,非自环都不可通,为某个最大值。但由于当存在负值时,不可达的两点间的距离也会发生变化,所以最后判断是否有通路时只要大于一个INF的相同数量级即可。

2022-04-13 18:50:51 360

原创 852. spfa判断负环 Java代码

用spfa判断负环,只需要在spfa求最短路的基础上维护一个cnt数组,cnt[i] = j:表示从源点到顶点i经过的边数是j。存在负环的条件:cnt[x] >= n,意味着1~x经过了n条边,n+1个点,而图中只有n个点,所以n+1个点中至少有一个点出现了两次,即存在环,要想使得距离更小,环只能是负环。

2022-04-13 16:59:13 131

原创 851. spfa求最短路 Java题解 (spfa)

spfa最短路算法是对bellmanFord算法的优化,用于求单源最短路间的带负权的算法,一般时间复杂度为O(m),但最坏情况为O(nm)。spfa要求图中不能有负环(否则回无限循环)。belllmanFord算法核心是 遍历每条边:dis[b] = min(dis[b], dis[a] + c)。即取决于dis[a]是否更新过,用宽搜优化。spfa算法将每次从源点发生变化的点入队,因为只有某些边缩小了,之后的边才会借此更新。

2022-04-13 15:25:16 352

原创 853. 有边数限制的最短路 Java题解 (bellmanFord)

bellman_ford算法是解决单源最短路的一种算法,相比于dijkstra它在求最短路时,允许存在负权边,算法复杂度为O(nm),最适合限制边数时求最短路。更新方式:假设a-- >b,权值是c,则 dis[b] = min(dis[b], backup[a] + c),backup数组是备份数组,为了保证每次迭代只扩展一步,防止发生串联效应,需要记录上一回迭代后的结果。

2022-04-12 23:44:54 288

原创 850. Dijkstra求最短路 II Java题解 (dijkstra堆优化)

dijkstra的朴素版时间复杂度为O(n^2),其中在找没有确定距离的点中的最小值上最耗费时间,找最短距离的过程为O(n),可以将所有点放于堆中,实现O(1)内取出最小值。朴素版主要处理稠密图,堆优化处理稀疏图,其中在更新图中点的距离时,若用邻接矩阵开销太大,需要用邻接表存储,总共要更新m次,每次往堆中放元素的复杂度为O(logm),算法总共的复杂度为O(mlogm),由于m最多为n^2,所以也相当于O(mlogn)。其中n为图中顶点数,m为图中边数。

2022-04-12 20:40:12 479

原创 849. Dijkstra求最短路 Java代码 (dijkstra朴素版)

dijkstra算法是求单源最短路问题的算法,即从某个固定的点到图中其余任一点的最短路。需要满足图中的权值均为正值,无负权。朴素版的dijkstra又要求图为稠密图,即图中的点数与边数的平方成正比,时间复杂度为O(n^2),其中n表示图中点数。

2022-04-12 00:14:22 726

原创 845. 八数码 Java代码 (bfs)

通过移动x的位置,找出到达终点状态的最少次数,属于权值为1的最短路问题,用宽搜。由于是从初始状态的图到终止状态的图,所以需要将八数码的所有状态抽象成图中的一个结点。状态表示:八数码是3x3的矩阵,可以将二维矩阵转换为一维的字符串,用字符串存储状态。记录到达每个状态的移动次数:由于不能直接用数组表示距离,所以可以用map记录,key存储每个状态,value存储到达每个状态的次数。若某个状态的value为空,则表示该状态还没有被访问过。

2022-04-11 20:36:23 678

空空如也

空空如也

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

TA关注的人

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