![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构学习
不要绝望总会慢慢变强
当你觉得整个世界都放弃了你,还有那几行代码值得你珍重!
展开
-
矩阵连乘问题
动态规划例1 矩阵连乘问题引入例如矩阵连乘积A1A2A3A4A_1A_2A_3A_4A1A2A3A4可以有下列5中完全加括号的方式:(A1(A2(A3A4)),(A1(A2A3)A4),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)(A_1(A_2(A_3A_4)), (A_1(A_2A_3)A_4) , ((A_1A_2)(A_3A_4)) , ((A_1(A_2A_3))A_4) , (((A_1A_2)A_3)A_4)(A1(A原创 2020-09-26 18:04:26 · 1281 阅读 · 0 评论 -
数组中出现次数超过一半的数字
学习了:1.python字典的运用2.python列表运用代码:class Solution: def MoreThanHalfNum_Solution(self, numbers): dict = {} for i in numbers: if i not in dict: dict...原创 2020-04-27 17:33:33 · 137 阅读 · 0 评论 -
平衡二叉树的调整
学习数据结构以来,平衡二叉树的调整一直会了又忘,写个博客加深记忆 理解:平衡二叉树:任意结点的左右子树高度之差要小于等于1。当新插入的结点使得这种平衡性被破坏,就需要调整。怎么调整取决于造成不平衡的“麻烦结点”和“根结点(插入后不平衡结点)”的位置关系。最重要的是!!!!:调整哪三个结点 怎么调整:将三个结点中位于中间的树变为根节点1....原创 2019-12-09 10:33:51 · 937 阅读 · 0 评论 -
中缀与后缀表达式详解
1.介绍中缀:(5+20+1∗3)/14后缀:520+13∗+14/中缀表达式,就是我们日常适用的算式,主要是运算符的优先级和括号会改变优先级。我们人用中缀表达式是很方便的,但是计算机算很不方便,所以就有了后缀表达式。2.原理与代码比如这样一个后缀表达式:ABCD-*+ ,怎么算呢? 先从左到右扫描,如果遇上字母,则压倒栈中,这样就把A,B,C,D全部压到...原创 2019-12-06 19:45:36 · 5458 阅读 · 0 评论 -
选择排序
------------选择排序思想:每一轮选择最小的放在左边最好情况:O(n2)最坏情况:O(n2)(选出的a[0]为最大或者最小元素)平均:O(n2)稳定性:非稳定排序仅适用于顺序表,链表代码:#include<stdio.h>int a[] = {2,100,15,25,99,44,24,56};void swap(int &a,...原创 2019-11-09 11:11:02 · 272 阅读 · 0 评论 -
PAT A1021 Deepest Root(25 分)------图2---求最大联通子图和最大深度的节点集合(看)
总结:1.这道题算是相对比较麻烦的一道题,开始题意没读懂,A graph which is connected and acyclic can be considered a tree.开始没明白他说的这个树是什么,被acyclic误导了,以为不能出现三角形这种循环的图,结果是大于2个最大连通子图都不是树2.这道题的麻烦之处在于先要看该图是不是只有一个最大连通子图,如果是则要求最大深度的节点...原创 2018-08-29 08:58:02 · 521 阅读 · 0 评论 -
PAT A1064 Complete Binary Search Tree(30 分)--------------完全二叉搜索树----复习+1
总结:1.给定一组树,我们可以确定一棵完全二叉搜索树,其中的大小关系按从小到大就和中序遍历一样,最先被遍历到的元素最小。代码:#include<iostream>#include<vector>#include<queue>#include<algorithm>using namespace std;vector<int&...原创 2018-08-25 00:36:17 · 139 阅读 · 0 评论 -
PAT A1043 Is It a Binary Search Tree(25 分)-----------二叉搜索树与二叉镜像搜索树----必看!
再次申明:本博客仅供个人pat复习之用,某些方法借鉴于某某博客开头会申明本题解答来源:https://www.liuchuo.net/archives/2153总结:这段代码的精妙之处在于以下几个方面:1.按常规出发:判断是否是二叉搜索树--》判断是否是镜像二叉搜索树-》是的话分别求后续遍历否的话--》cout<<"NO";该代码首先假定为二叉搜索树---》在假...翻译 2018-08-24 21:09:17 · 201 阅读 · 0 评论 -
PAT A1087 All Roads Lead to Rome(30 分)----最短路径(加筛选条件)
总结:1.图中的点名称为字母,所以用两个map来进行转换2.先求最短路径集合,再求符合要求的最短路径代码:#include<iostream>#include<vector>#include<map>#include<string>using namespace std;int weight[500];int vi[500...原创 2018-08-31 18:43:56 · 303 阅读 · 0 评论 -
PAT A1072 Gas Station(30 分)-------图最短路径---比较难点的题
总结:1.这道题用了dijstra算法,关键是开始对G1非数字的处理即Gi处理成i+n;我最后一个测试点开始没过就是因为用s.size()判断输入为数字还是G2,但是其实数据n+m是大于99的代码:#include<iostream>#include<algorithm>#include<vector>#include<string&g...原创 2018-08-31 16:54:19 · 1045 阅读 · 0 评论 -
PAT A1013 Battle Over Cities(25 分)---图1---求最大连通子图数量
总结:1.关于图的题可能会超时,优先选printf和scanf,优先选邻接表存储代码:#include<iostream>#include<vector>#include<algorithm>using namespace std;int repair = 0;vector<vector<int> >pp;int...原创 2018-08-28 19:11:29 · 393 阅读 · 0 评论 -
PAT A1034 Head of a Gang(30 分)---图3---图的遍历---求符合条件的最大连通子图(序号用字母代替)
总结:1.涉及到图的时候一定要考虑a和b,b和c,那么a和c也有联系2.就是把1 2 3 4 5 换成A B C D E问题就复杂好多3.读题!!!!代码#include<iostream>#include<vector>#include<map>#include<algorithm>#include<string&...原创 2018-08-29 15:38:41 · 165 阅读 · 0 评论 -
PAT A1099 Build A Binary Search Tree(30 分)----二叉搜索树(非完全)--求层次遍历
总结:1.感觉挺简单的,只要思路清晰,写一遍就全ac了,这种题再给我来一打哈哈哈哈2.掌握层次遍历利用队列----左子树先进队,右子树后进队,主要考察怎么表示一棵树!!代码:#include<iostream>#include<queue>#include<algorithm>#include<vector>using nam...原创 2018-08-25 14:37:18 · 189 阅读 · 0 评论 -
PAT A1018 Public Bike Management(30 分)
总结:该代码有两个测试点没过,因为没有考虑0->2>3>1(2,3,1权值分别为:54,0,78),最大容量为100,这种情况需要send46辆,剩18,而不是send18,剩01.这道题考察了dfs,最短路径问题,加上了送出的车最少和拿回的车最少,主要是自己之前理解出错,导致第一次没通过,第二次的代码是分开做的便于理解代码1;#include<iostr...原创 2018-08-29 19:15:58 · 473 阅读 · 0 评论 -
PAT A1066 Root of AVL Tree(25 分)------AVL树的调整------很精彩(attention)
总结:----第一次写---妄图用数组来完成--事实证明是不现实的。。。。。本代码参考:https://www.liuchuo.net/archives/2178总结第一次失败的教训:1.没有理解好rotate的精髓,用数组麻烦得多2.整体代码结构不是特别清晰,通过ac这道题,让我加深了对avl树的理解,以及对树整章的理解。3.这代码难点主要是对插入后的判断和调整,判断主要...原创 2018-08-25 20:08:49 · 221 阅读 · 0 评论 -
PAT A1003 Emergency(25 分)----最短路径
总结:这道题坑的地方在于求最大集结救援队是值得一条最短路线上的所有节点之和,而不是所有最短路径上的节点之和深搜(dfs):1.求路径,点权,边权。遍历,最大连通子图。2.两段代码分别使用深搜和dijkstra算法解决的,有兴趣可以两端都看看,第二段代码比第一段快,递归程序消耗大。dijkstra算法相当于非递归版的广度搜索。代码:#include<iostream&...原创 2018-08-29 23:32:49 · 428 阅读 · 2 评论 -
PAT A1110 Complete Binary Tree(25 分)----判断是否完全二叉树
总结:1.这道题很简单,但是我第一次只得了18/25.做简单题的时候一定要细心。2.当表示没有孩子的时候用-,所以开始很自然的想到用char读取,但是注意孩子的序号完全可能为两位数,11,12.所以用string读取。代码:#include<iostream>#include<vector>#include<map>#include<...原创 2018-09-01 17:51:48 · 393 阅读 · 9 评论 -
PAT A1109 Group Photo(25 分)
1.这道题初看题意复杂,其实很简单的排序问题。2.要注意用vector的时候一定不要多给,少给了会vector out of ....,但多给了不容易看出来,要多少给多少,我就是因为多给了导致排序出来得结果有两个空node代码:#include<iostream>#include<vector>#include<string>#include&...原创 2018-09-01 17:55:20 · 256 阅读 · 0 评论 -
PAT A1108 Finding Average(20 分)
总结:1.最坑的就是 printf("The average of %d number is %.2f", pp.size(), ps);当只有一个合法数字的时候输出number2.代码:#include<iostream>#include<vector>#include<string>using namespace std;vector...原创 2018-09-01 18:20:38 · 154 阅读 · 0 评论 -
PAT A1111 Online Map(30 分)----最短路径麻烦题
总结:最后一个测试点超时。。1.这道题因为两个要求,同时求的话要互不影响才行,就像求最短路径的时候不能更新时间(重新设置个变量更新)2.以求最快路径为例,当totalen<minlen一定要更新totalsize,否则结果可能出错3.这种题优先采用dijstra方法代码:#include<iostream>#include<vector>#in...原创 2018-09-01 20:27:50 · 646 阅读 · 0 评论 -
PAT A1053 Path of Equal Weight(30 分)-----树---dfs必看经典题目(attetion)
总结:1.这道题不难,但是是我在pat中遇到的关于树遍历题目相对比较复杂的题目之一了,给我的感觉和图相似,当然图更难。这道题有权,还要求规定sum的路径,还不止一条。2.我的解决办法是用dfs加了sum(从根到叶权之和,以及一个vector参数,用来记录从根到叶都经过了哪些节点),用了map来记录不同sum的路径3.sort()自定义排序过程中遇到了一个问题:[C++] Express...原创 2018-08-24 14:58:50 · 167 阅读 · 0 评论 -
PAT A1030 Travel Plan(30 分)
总结:1.常规套路,关键想想怎么存储图,然后就easy了代码:#include<iostream>#include<vector>#include<map>using namespace std;int vi[600];struct road{ int st; int end; int cost; int d...原创 2018-08-31 13:39:53 · 109 阅读 · 0 评论 -
PAT A1047 Student List for Course (25)------排序方法重点2
总结:1.写这道题的时候第一次只过了一个点,因为思考不周,多输出了"\n",导致格式错误,下次若是格式错误多试几下就好了,然后就是最后一个测试点过不去超时。2.想好思路写代码:真的很快很爽:不怎么需要调试---前提是有思路哈哈哈哈哈哈哈哈!!!3.参考代码中用char[][]二维数组来存名字,比较的时候比较序号的确节省了很多时间,而且代码量几乎减半4.读题一定要读数据范围----否...原创 2018-08-08 18:36:16 · 173 阅读 · 0 评论 -
PAT A1039 Course List for Student (25)--vector的使用
1.总结:vector真的贼好用,不仅可以根据输入数据设置大小,节省空间,而且可以一维,二维,多维各种数据类型的组合。2.cin,cout这种题肯定会超时,以后注意用char*,scanf和printf3.参考代码用的很巧秒,因为name只有三个字母,可以映射到hash表中(占用数组空间也不大),大大提升了效率4.还是先想思路,在写代码才会下笔如有神!!!代码(最后一个点超时):...原创 2018-08-08 15:29:55 · 216 阅读 · 0 评论 -
PAT A1038 Recover the Smallest Number (30) --贪心2
总结:1.最开始的思路是:先找第一个数(即前边0最多的数,如果前面都没0就是第一个数最小的数),然后对剩下的数排序--第一个数小的在前边,如果两个数长度不一样,还要看长的那个数后边一位是不是剩下的数中最小的--要自己写一个字符串排序太麻烦了2.后来想起来了自定义规则可以这样写:return a+b<b+a;不过不大确定正确性,后来结果只有一个测试点没有过,看了网上的答案才知道没有过的...原创 2018-08-06 14:25:55 · 163 阅读 · 0 评论 -
PAT A1067 Sort with Swap(0,*) (25)(25 分)-----贪心法1---典型
总结:1.算法还是很好想,如果0不在0位,就将0与该在这个位置上的数交换,如果0在0位,就把它与任意一个不在正确位置上的数交换。写的时候要注意细节,我用了一个pos[i]来表示i在start数组的位置,交换过后不仅要交换数字,还要交换位置。用了一个cnt来确定什么时候停止循环,cnt--不再正确位置上的数的个数,当其等于0的时候停止循环2.要注意如果一个数(下标为index)和0交换过了后...原创 2018-08-06 13:16:45 · 263 阅读 · 0 评论 -
PAT A1097 Deduplication on a Linked List (25)
总结:1.使用vector时一定考虑vector中没有元素的情况--也要考虑给的测试数据为0的极端情况2.写代码一定要仔细!代码:#include<iostream>#include<algorithm>#include<vector>using namespace std;struct node{ int data; ...原创 2018-08-05 18:52:18 · 135 阅读 · 0 评论 -
PAT A1052 Linked List Sorting (25)----链表3
总结:1.考察静态链表的时候可能有些点不在链上,必须遍历一次找出有效节点。2.可能测试数据有0个节点的情况,单独考虑3.细心点,这次我犯的错误是:在上边输出起始地址的时候没有%05d输出导致有一个测试点错了代码:#include<iostream>#include<algorithm>#include<vector>using name...原创 2018-08-05 18:09:20 · 113 阅读 · 0 评论 -
PAT A1074 Reversing Linked List (25)--链表2
总结:1.采用两个数组存储每个节点的数据和下一个节点的地址2.reverse操作通过遍历一遍链表把每个节点的地址存在list中,然后将翻转操作变成从list到result地址的对应变化输出即可代码:#include <iostream>using namespace std;int data[110000], next1[110000];int list[1100...原创 2018-08-05 15:57:24 · 187 阅读 · 0 评论 -
PAT A1032 Sharing (25)--链表1
总结:1.采用静态链表存放数据(data[10000]放数据,next1放下一个节点地址)2.printf("%d %c %d");//中间有空格3.读题的时候注意链表的节点如:00001 00002 400001 a 1000110001 s -100002 a 1000210002 t -1两个a的节点地址如果一样,那么如果下一个节点地址也一样的话,前面的节点就会...原创 2018-08-05 15:53:09 · 241 阅读 · 0 评论 -
数据结构之二叉树
#include<iostream>#include<stack>#include<queue>using namespace std;typedef struct tnode TN;typedef struct tnode* TT;struct tnode{ int data; TT left,right;};void cr...原创 2018-08-16 16:05:35 · 135 阅读 · 0 评论 -
树1----由中序遍历+前或者后推其余遍历
本文参考柳神博客:https://www.liuchuo.net/archives/2090仅用于复习pat考试用,在此鸣谢柳神这道题思路很明确,用递归处理很简单,但是有几个注意点:对树的理解不当可能造成一些困扰,我会在代码中一一标明本例为已知后序遍历和中序遍历,推前序遍历和层次遍历:1.由后序遍历左右根和中序遍历左根右我们可以确定根的位置和左子树,右子树的个数如根节点为7的时4的...原创 2018-08-22 15:46:28 · 136 阅读 · 0 评论 -
PAT A1086 Tree Traversals Again(25 分)---树的遍历--由进出栈情况确定树
总结:1.读懂题意,比如这道题可以根据进栈情况确定前序遍历,由出栈确定中序遍历,后序遍历序列就好求了2.入栈序列为前序遍历,出栈为中序遍历 代码:#include <iostream>#include<stack>#include<string>using namespace std;int pre[100...原创 2018-08-22 16:29:10 · 199 阅读 · 0 评论 -
各种排序总结
冒泡排序:https://blog.csdn.net/luoshiyong123/article/details/102981691快速排序:https://blog.csdn.net/luoshiyong123/article/details/80667676选择排序:https://blog.csdn.net/luoshiyong123/article/details/102984...原创 2018-08-28 17:04:07 · 718 阅读 · 0 评论 -
PAT A1098 Insertion or Heap Sort(25 分)------堆排序(attention)
总结:这道题始终有一个测试点过不去,是因为插入排序如 序列s为:1 3 5 7 7 2 0,这个序列前边5个都是有序的。所以第一个无序元素的时候while(s[i]<=s[i+1])有等号。。。。1.这道题考的是给定一个序列,让你判断是堆排序还是插入排序,对于插入排序,前边为有序队列,后边为无序队列,只要找到有序队列旁边第一个无序数,就可以用sort排序,而对于堆排序,先构建最大堆,...原创 2018-08-28 16:24:16 · 610 阅读 · 1 评论 -
PAT A1004 Counting Leaves (30)(30 分)
代码:#include<iostream>#include<vector>#include<map>using namespace std;int m, n;int level, maxn=-1;map<int, int>sk;vector<vector<int> >pp;void dfs(int inde...原创 2018-08-23 21:35:00 · 113 阅读 · 0 评论 -
PAT A1094 The Largest Generation(25 分)----树dfs求最大同层孩子树
代码:#include<iostream>#include<vector>#include<map>using namespace std;int m, n;int level, maxn;map<int, int>sk;vector<vector<int> >pp;void dfs(int inde...原创 2018-08-23 20:40:14 · 106 阅读 · 0 评论 -
PAT A1090 Highest Price in Supply Chain(25 分)--树---dfs简单应用
总结:1.这道题是dfs简单运用,map简单应用,读懂题意不粗心即可,加油加油~~~~~~~~~~~~~~~~~~~~~~~~~~~~代码#include<iostream>#include<vector>#include<cmath>#include<map>using namespace std;const int maxn...原创 2018-08-23 19:01:30 · 93 阅读 · 0 评论 -
PAT A1079 Total Sales of Supply Chain--树---dfs遍历
总结:1.在第一次写这道题的时候,我觉着这道题思路挺明确的,不好解决的是题目里说节点数不超过10的10次方有点大了,不好开数组,而且我对于每一道关于树的题我都避免用结构体创建树,怕问题变得麻烦,要么就是通过一个一维数组创建树,或者取巧不创建。2.在这道题中我的思路是每一个节点i都是一个vector[i],vector的大小就是其孩子的个数,在读入数据时候我们要确认根节点以及叶子节点的amo...原创 2018-08-23 18:02:37 · 210 阅读 · 0 评论 -
1102 Invert a Binary Tree(25 分)--二叉树反转左右孩子
总结:1.做这道题的时候开始没读懂题意,把invert意思记错了,导致左右子树是反的,很无语,刚过了六级看来不够,继续学习英语很有必要。2.做这道题的时候思路应该是很明确的,但是花了一个多小时,为啥呢》》》分析如下:思路:在读入数据的时候确定根节点,然后保存每一个节点的左右孩子节点(反着保存),然后用一维数组递归建立二叉树,层次遍历就很好解决了,中序遍历也很ok,然后这道题应该是很ea...原创 2018-08-23 15:59:23 · 378 阅读 · 0 评论