数据结构专题
文章平均质量分 79
流年冲淡时光
这个作者很懒,什么都没留下…
展开
-
根据后序和中序建树
顺便写下后序和中序建树吧,都前面的大同小异。代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NU原创 2016-10-12 22:18:31 · 663 阅读 · 0 评论 -
HDU5438拓扑排序删点加DFS
类似拓扑排序:去掉无向图度数为一的点,并把和它相连的点的度数j原创 2015-09-13 14:17:08 · 801 阅读 · 0 评论 -
小白书埃及分数之加深迭代搜索
首先说一下什么事加深迭代搜索:其实就是控制深度的dfs,至于这个深度控制在多少根据题来定。然后讲一下这个题。控制深度之后,枚举第k个分数然后dfs下去,第k个分数要确定上下界,上界即为a/b+1,下界首先要符合剩下的还有几个分数,然后不能超INT,具体的代码中查看,由于加深迭代搜索已经控制了题目中说的是分数数目最小,然后就是每次找到符合的,在某个第k项分数更小的话就更新an原创 2015-09-14 10:58:39 · 352 阅读 · 0 评论 -
小白书之最优程序
这题是一个隐式树的bfs,注意输入n对数,n对数公用同一个程序去计算结果,相当于一个程序同时去计算几对数,然后用一个二维数组存下每次计算的值,bfs的时候注意判断下一步需要所有对数都满足可以计算的条件才能加入队列,不过感觉他写的代码比较繁琐,而且bfs写的有些奇怪,自己不怎么想写,看了好久才看懂这个代码,主要理清俩点:1:同一个程序去计算所有的点对数,同时计算。2:每步计算要满足条原创 2015-09-13 21:23:26 · 526 阅读 · 0 评论 -
HDU5444排序二叉树的建立与查找
网上找的板子,改了下就过了,就T了一发,后来发现数组开小了,这我就郁闷了,数组开小了不应该是RE吗,怎么变成T了。#include #include #include using namespace std;typedef struct BiTNode{ int value; struct BiTNode *lchild,*rchild;}*BiTree;原创 2015-09-13 14:20:51 · 444 阅读 · 0 评论 -
RMQ维护最小最大值加二分
Problem G: Good subsequenceTime Limit: 2 Sec Memory Limit: 256 MBSubmit: 202 Solved: 44[Submit][Status][Web Board]DescriptionGive you a sequence of n numbers, and a number k you sh翻译 2015-03-28 18:17:00 · 397 阅读 · 0 评论 -
UVA表达式树的后序遍历和层次遍历和建树
太笨又太蠢,做的小白书后面的题,前面写的线性表部分的内容,就一直在想线性表的做法,想vector,想stack,结果是表达式树,建立二叉树根据后缀表达式,然后层次遍历一遍反转就行了。#include#include#include#include#include#include#include#include#include#include#include#inclu原创 2015-08-20 20:22:05 · 437 阅读 · 0 评论 -
UVA539dfs搜一条无重复边的最长道路
这题刚开始想的按点搜,结果代码写着写着发现写残了,然后就改成了按边搜,以每条边为起始边往深层去递归就行了,记得递归返回之后要还原就行了。#include#include#include#include#include#include#include#include#include#include#include#include#define LL long long原创 2015-09-24 22:16:36 · 458 阅读 · 0 评论 -
UVA10047四维bfs
本来是小白书上面给的习题,神奇的变成了大白书上例题。其实就是一个四维的bfs,因为每个格子多了俩个状态,即方向和颜色,另外bfs搜索最短路的原理是根据搜到的下一个格子是上一个格子距离加一来算的,因为是宽搜,所以一旦搜到要到达的点,则那个点存的距离即使到那个点的最短距离,而这个题,当它在原本的格子里不动的时候即为一个状态,时间即加一,但是格子距离并不加一,所以和bfs搜索最短路的原创 2015-09-04 21:03:42 · 365 阅读 · 0 评论 -
UVA10305拓扑排序
拓扑排序模板直接贴就行了:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define LL long longusing namespace std;const int N=1e2+1原创 2015-09-05 21:17:27 · 292 阅读 · 0 评论 -
UVA11111套娃匹配题,注意字符串流使用简化代码
开俩个栈,第二个栈用来判断外部容量是否大于内部容量,同时这题读入可以用字符串输入流,极大简化代码,注意toy必须成对输入,也就是不能有多余的负值,也不能有多余的正值,因为忘记判断多余的正值贡献了无数发WA。#include#include#include#include#include#include#include#include#include#include#原创 2015-08-19 20:26:55 · 462 阅读 · 0 评论 -
UVA673括号匹配之vector和stack使用的时候的注意点
这题其实是一个简单题,无耐自己太笨,刚开始想投机取巧,把思路搞错了,后来直接用vector暴力模拟一发,结果无数发RE,最后发现i一直RE,强制转化为int类型即可,后来感觉自己vector写的没人别人用栈写的简单,又撸了一发stack的,然而又RE,RE无数发后,发现,stack在top之前必须判断是否非空,否则RE。贴上代码,注释部分为Vcetor写的。#include#原创 2015-08-19 11:17:04 · 504 阅读 · 0 评论 -
UVA10557SPFA或者bfs+dfs
这题有俩种做法,第一种,也即是最容易理解的就是dfs+bfs.刚开始写的时候,dfs那里刚开始时直接处理了sum,让sum+a[tem]。然后一直调BUG不知道哪里错了,后来发现后面的俩个if语句处理的是有正环的情况和非环的情况,而这题可能会有负环,提前加了sum,显然是不对的。#include#include#include#include#include#原创 2015-09-04 14:31:27 · 433 阅读 · 0 评论 -
UVA442矩阵乘法之求出多个矩阵相乘乘法的次数
这个题自己刚开始写的,受前面那个题的影响开了俩个栈,一个拿来存括号了,然而这个题保证输入合法,不需要将括号入栈,另外自己刚开始还重重载了矩阵赋值函数,后来发现矩阵竟然不需要重载赋值函数,不知道为什么矩阵不需要重载赋值函数。#include#include#include#include#include#include#include#include#include#i原创 2015-08-19 14:36:09 · 557 阅读 · 0 评论 -
UVA196拓扑排序形式的搜索
这题从表面上来看是一个拓扑排序,然而实际上是一个搜索,起初看到这题行数是0~999,而列数是1~18278,然后感觉只输出都会超时,不敢写,后来发现别人写的列数都变成了1000,完全不知道怎么回事,也不明白怎么莫名其妙的变成了1000,然后就好写了,1000*1000个格子,建立一个G[1000*1000]的vector去存是公式的那个格子所有求出答案所需要的格子的下标,然后一个一个去原创 2015-09-08 11:32:19 · 364 阅读 · 0 评论 -
小白书之隐式图的bfs
可以把三杯水各个时候的状态想象成一个点,能到达的点画一条有向边,这样就出现一个图,对这张图进行dfs,这里注意要用一个set去掉重复的状态,以免陷入死循环。同时这题用一个数组同时存储了三个杯子的状态并且顺带储存了父亲节点的状态,比较巧妙,但是好像一般bfs都是手写的队列,但是我习惯了用queue容器。#include#include#include#include#includ原创 2015-09-14 14:01:40 · 700 阅读 · 0 评论 -
小白书隐式图搜索之八数码问题
这题也是一个隐式图的问题,bfs即可,既是简单bfs的结构体办,用一个二维数组去存储每次可到达的点的状态,这题既是一个二维数组去存储九个数的状态,另外记得要写初始化函数look_up_table()和判重函数insert(),(即简单那bfs中的vis数组),俩个条件均满足方可插入队列,由于要存储状态这里用数组去代替队列更容易,而且可以增加二维数组的第二维的维数用来存储距离或者父节点原创 2015-09-14 19:59:30 · 692 阅读 · 0 评论 -
根据前序和中序建立二叉树
之前一直以为很简单,碰见的话肯定能写出来,结果今天面试竟然碰到了,写了半天硬是没写对,很是尴尬,其实和我最后想的分别记录前序数组的前后位置,以及后序数组的左右位置是一样的,当时又感觉不太对,没敢写,结果别面试跳过了。代码:/** * Definition for binary tree * struct TreeNode { * int val; * Tre原创 2016-10-12 22:01:56 · 1314 阅读 · 0 评论 -
leetcode无向图的复制之搜索
这个题和之前的链表随机指针复制有些类似,所以只能用深度或者广度搜索,因为必须后面的节点出现了,才能构造前面节点的邻接点的集合,具体的看代码:class Solution {public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { unordered_map vertexs;原创 2016-09-04 15:57:02 · 422 阅读 · 0 评论 -
UVA10954哈夫曼树与优先队列
这个题就是一个最小堆,也就是常说的哈夫曼树,可以直接使用STL优先队列,先给一个哈夫曼树的代码,建树,取堆值,插入值。哈夫曼树:#include#include#include#include#include#include#include#include#include#include#include#include#include#define LL lo原创 2016-03-21 23:49:17 · 439 阅读 · 0 评论 -
连续序列分成m段,最大值最小化,二分经典
这题比较巧妙地去猜答案,二分,重点是怎么求m段的连续和是否满足,这里用了一个贪心,不大于x,就一直把线往后移,大于的话就加一条线。#include#include#include#include#include#include#include#include#includeusing namespace std;const int maxn=1e6+10;const原创 2016-03-03 19:58:32 · 2435 阅读 · 2 评论 -
UVA529加深迭代搜索,起点为1,终点为n,数列中的每个数由前面俩个数的和组成的最短数列
看到最短就应该想到bfs,然而并不行,这题是加深迭代搜索,控制深度,这里深度我试着用30,29,40前面俩个可行,最后一个WA了,自己感觉最后提个应该不是WA,而是T,系统给了WA。注意这里最大的一个剪枝,就是如果一个数翻ans-cur倍仍然小于n,这个数肯定不行。具体细节看代码:#include#include#include#include#include#include原创 2015-11-02 12:41:36 · 357 阅读 · 0 评论 -
BC#62C题求二叉树不同节点数的子树的个数
这次只做了俩道题,而且A题WA了2发(然后突然发现仅仅是数组开小了,hash表要开到2000),B题WA了四发(考虑清楚各种特判就行了),室友和我一起做的,他以前是搞acm的,但好久不搞了,虽然比赛的时候也只做出俩题,但是排名在我前面,而且比赛后还做出了第三题没有看题解,这难道就是智商压制么,汗颜啊。C题其实只要从二叉树最后面往前递归,把数组加入set,即可实现判重,注意每层的节点数目原创 2015-11-01 19:57:14 · 683 阅读 · 0 评论 -
UVA307把n个剪断的木棍还原,暴搜
暴搜真的是一门很深的学问,比如这个题,其实想了很久,并没有什么思路,因为如果你单纯的去想的话就会发现可能会存在很多种可能性,这时如果时间允许的话,就可以暴搜所有答案,但是一般需要加剪枝,不然就太水了。下面说下几个重要的剪枝:1.把所有木棍的长度从大到小排列,组合木棒时优先使用长的木棍,这样可以加快组合速度,并且对后面的剪枝有帮助。2.木棒的长度一定是大于等于最长木棍的长度并且小于等原创 2015-10-13 19:35:21 · 902 阅读 · 0 评论 -
UVA301回溯法求坐火车问题的最大收益
这题站点最大为七,订单数为22,然后一开始就想着去按站点去进行搜索,然后写了n久,写不对,写残了,然后就去搜订单。当时脑子乱了,去随便去写搜索搜订单,最后写好交上去连着T了4发,最后稍微改了下竟然以2666ms的时间险过了,然后看了看别人交的时间,再没有比我的时间长的了,而且竟然还有一个19ms过的,实在很想看看别人19ms是怎么过的,然而别人的代码不开放,没办法了,但比我的时间少的代原创 2015-09-25 16:32:19 · 462 阅读 · 0 评论 -
UVA639八皇后变形式之中国象棋盘上放車
这题数据最大只有4X4,很显然暴力回溯搜索就行了,刚开始自己想的是写一个递归,递归下标搜索,然后用一个临时的二维数组调用,但是失败了,函数貌似不能调用二维数组。但实际上应该直接递归结果即放置的車的个数,每当搜到一个可以放置車的位置,标记,往深层递归就行了,然后注意没有返回值但是有循环的递归,递归结束了相当于这个递归完成了,可以返回了,不要条件判断什么时候返回,所以这里注意返回到上一层后原创 2015-09-24 16:19:53 · 590 阅读 · 0 评论 -
UVA110模拟出Pascal的8个数字的排序代码插入式递归
这题刚开始没想到,实际上就是排序,一直注意神奇的Pascal代码,想找规律来着,然而并没有找到,但实际上自己想一下排序的实质是什么,就是一个一个的比较然后插入数组就可以了,然而这个题就是这样递归的,从小到大一直递归的最深层,然后从后往前一个数字一个数字的往前挪然后每挪一个数字再往下递归,递归到n就产生了一个不同的排列,就会产生不同的数组,实际上也是求排列的过程,然而当时并没有想到,然后原创 2015-09-23 22:24:39 · 443 阅读 · 0 评论 -
UVA592字符串推断题加暴力假设搜索
这题稍微有些复杂,当时想了很久没敢下手敲,主要还是代码能力不够,有了基本的思想不敢敲,而这道题实际上就是暴力搜索,因为只有五个人加上天气一共六个,直接假设就行了。这里用一个birth数组存储对话过程中曾经出现的人物。然后结果肯定是通过出现过的人物然后假设就行了。同时注意如果搜索的所有情况均不可行,说明对话有错误,即是第一种情况。此外有一种情况成立并不能说明什么,只有在所有情况下都成原创 2015-09-23 20:06:21 · 391 阅读 · 0 评论 -
UVA10422八个方向图形状态搜素
这题其实一开始我写的代码稍微改下就能过,浪费了好长时间,发现超过十步的判断要写在for循环里面,不然会WA,后来想了一下,应该是写在外面状态数太多,存不下会导致WA,改一下就行了。这么写时间稍微长些,但是代码简单。#include#include#include#include#include#includeusing namespace std;const int MAX=原创 2015-11-10 18:04:20 · 388 阅读 · 0 评论 -
UVA10603倒水问题加优先队列
这题是一个倒水问题的变形,也是隐式图的搜索,刚开始读错题了,这题让求得是倒水量,而不是倒水的次数。然后这题要用优先队列,一旦搜到d,就退出搜索,因为是每次搜索得到新的状态都按照d进行了排序,所以一旦d的倒水量不为-1就可以退出,这里用优先队列不仅不用考虑状态的数组去开数组,而且这里必须有优先队列去优化时间,不然就会T,因为不用优先队列状态数目就太多了,对应杯子的水量相同,但是倒水量不同原创 2015-11-09 18:54:10 · 646 阅读 · 0 评论 -
hdu5497删除一个序列的连续m个数使得逆序对数最少
题解:g_igi表示在ii前面比a_iai大的数的个数, f_ifi表示在ii后面比a_iai小的数的个数, 这两个都可以用树状数组轻松求出来. 那么对于一个长度LL的连续子序列, 删掉它之后逆序对减少的个数就是这段区间中g_igi的和 + 这段区间f_ifi的和 - 这段区间的逆序对个数. 求区间逆序对个数只要用一个树状数组维护就好了,原创 2015-10-04 21:28:06 · 800 阅读 · 2 评论 -
UVA133循环数组加标记统计
水题,用循环数组加标记统计就可以了,注意循环数组从0开始好一些,比较容易计算。#include#include#include#include#include#include#include#include#include#include#include#include#include#define LL __int64using namespace std;//原创 2015-08-18 18:42:13 · 412 阅读 · 0 评论 -
UVA439深搜和宽搜区别
这题其实就是一个变种的宽搜,很简单,可是后来发现自己把宽搜和深搜给记反了,这题就一直写的是深搜,但是显然宽搜的题用深搜做事不对的,也学可以,反正本弱不会,但是前面几个深搜的题目,我都是用宽搜做的,事实证明深搜的题目是可以用宽搜来做的,而深搜和宽搜的最主要区别就是深搜用栈来实现,而宽搜用队列来实现,然后想象一下栈和队列的调用过程,很简单就可以知道深搜和宽搜的区别。#include#原创 2015-09-02 14:02:57 · 1422 阅读 · 0 评论 -
UVA10562n叉树递归
挺简单的一个递归,刚开始脑抽把函数变量名l,r拿来在函数里面用,改变了值,导致递归了一半就结束了,改了变量名就好了。#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#de原创 2015-08-28 10:52:09 · 294 阅读 · 0 评论 -
HDU5319暴力扫加标记
其实这题看清题意的话就会知道并不存在什么最优,只要找到一个方向暴力往下扫就行了,然后加上标记#include#include#include#includeusing namespace std;const int maxn=1000000;char s[56][1000],dp[56][1000],db[56][1000];int dir[4][2]={1,1,-1,-1,1,翻译 2015-07-31 13:00:14 · 398 阅读 · 0 评论 -
UVA839递归
所谓的递归即用栈而已,所以所有的用栈的形式给出的输入均可递归得到答案:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define LL long longusing n原创 2015-08-26 13:05:33 · 441 阅读 · 0 评论 -
UVA10010使用数组和一个for循环控制前进路径方向不变
注释部分为自己写的,想不到如何控制前进方向不变,只记得以前学dfs时每次方向都要改变,其实想控制方向不变加个for循环就行了#include#include#include#include#include#include#include#include#define LL long longusing namespace std;char s[60][60];string翻译 2015-07-19 23:48:09 · 441 阅读 · 0 评论 -
HDU5326多校签到题,搜索子孙节点,
dfs一发即可:#include using namespace std;const int N = 110;vector E[N];int in[N], son[N];bool vis[N];void dfs(int u){ vis[u] = true; son[u] = 1; for(int v: E[u]) { dfs(v);翻译 2015-07-31 13:04:02 · 382 阅读 · 0 评论 -
UVA327暴力讨论所有情况
这题是个水题,和UVA112一样,暴力讨论所有情况即可。#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define LL long longusing namespac原创 2015-08-26 12:31:54 · 689 阅读 · 0 评论 -
UVA699落叶,二叉树递归左右偏移
虽然说是一道很水的题目吧,但毕竟是本弱渣没有看题解,第一次写出递归程序,虽然是很简单的递归,甚至说可能不需要递归。另外这题起初T了一发,其实sum数组最多只有80个数而已,没必要开太大。另外这题我的写法还是有些繁琐,其实可以直接得出左右边界。#include#include#include#include#include#include#include#include原创 2015-08-25 20:47:47 · 392 阅读 · 0 评论