算法OJ
文章平均质量分 73
梦想总是要不可及,是不是应该放弃
大数据、算法与数据结构
展开
-
[面试算法]Python实现用队列对二叉树进行广度优先遍历(Breadth First Search, BFS)
导言曾经遇到过一道面试题,面试题如下:如果要用代码扫描出某个目录下的所有文件夹和所有文件,要求一层一层输出,怎么做?这道题,当时电话面试的时候思考了一会,想到无论是Linux目录结构,还是Windows单个磁盘的目录结构,都可以看做是一棵树。Linux当中还有tree这样的命令输出目录树,还能限定深度。目录树是一颗多叉树,类似二叉树,肯定可以用二叉树的方法去做。思考了一会,便进行了回答:目录的结构是一颗树,是一颗多叉树,树当中的每个节点代表着一个文件夹或具体文件,如果是文件,一定是叶子节点;如原创 2020-12-31 17:41:15 · 508 阅读 · 0 评论 -
[面试算法]Python根据前序+中序或后序+中序还原二叉树
导言在上一篇博客《[面试算法]Python实现二叉树三种遍历的递归与非递归形式》当中,我们详细讲述了二叉树深度优先遍历的各种办法。一道常见的面试题是,如何根据三种遍历的结果,还原出二叉树或进行二叉树重建?还是拿是上一篇博客的二叉树举例,二叉树的示意图及其三种遍历的结果都贴在下面:首先,根据某一种遍历的结果可以还原出二叉树吗?比如,仅仅有前序遍历的结果信息,我们知道A是二叉树的根节点,但是除此之外,就不知道了,比如下面这棵二叉树,其前序遍历的结果,和上面的二叉树前序遍历结果是一样的:因此,仅仅根据前原创 2020-12-31 13:14:21 · 1418 阅读 · 0 评论 -
[面试算法]Python实现二叉树三种遍历的递归与非递归形式
二叉树及其数据结构定义二叉树是计算机当中最重要的数据结构之一,其应用非常广泛,例如数据库的索引使用的B+树是一种特殊的二叉树,堆排序所使用的堆是一种特殊的二叉树,Java当中HashMap使用的红黑树是一种特殊的二叉树。可见,二叉树在计算机当中有着重要地位。二叉树的遍历是二叉树的基本操作,也是不仅是面试的常考考点,也是程序员用来锻炼思维的小把戏。二叉树的定义是递归的,即满足如下条件的树是二叉树:一棵树当中的每个节点,最多有2棵子树;如果一个节点有子树,那么子树必须是二叉树。我们可以看到,二叉树原创 2020-12-29 15:00:49 · 881 阅读 · 0 评论 -
[面试算法]中缀表达式转后缀表达式Python
后缀表达式的特点是:操作数在前面,后面紧跟着操作符。a+b转换成后缀表达式就是ab+。解决优先级问题。a+bc。\的 优先级比+高,因此在后缀表达式中,*应该比第一个+更先出现。因此,这个中缀表达式将是 abc+括号的作用。一对括号内部的是一个合法的表达式,是一个结果,因此可以将一对括号看做一个操作数。中缀表达式转后缀过程中,括号内的表达式,一旦遇到右括号,必须触发计算,不能继续等待。遇到括号,就得将括号内的这一部分表达式转化为后缀表达式。就像(a+b)*c的后缀表达式为ab+c*。总结以下规则如.原创 2020-11-11 16:07:12 · 1866 阅读 · 1 评论 -
排序算法的稳定性探究
结论排序算法的稳定性与具体的实现有关,一个不稳定的排序算法,通过额外的时间或空间,可以转变为稳定的;一个稳定的排序算法,也可以转变为不稳定的。这与大多数课本的说法有所不同,课本对每种算法的稳定性都给出了肯定唯一的答案,其实都隐含了各自的前提条件。下面举例说明这个问题,排序是从小到大排序。冒泡排序的稳定性冒泡排序,每次都从第0个元素开始遍历,比较当前元素arr[i]和下一个元素arr[i+1],如果arr[i]>arr[i+1],那么交换二者,i增加1,继续类似的比较。冒泡排序过程中,存在相邻原创 2020-09-08 17:22:35 · 181 阅读 · 0 评论 -
面试题-链表
什么是链表?链表是一种物理上非连续的逻辑存储结构,每个节点有指针域和数据域,指针域存储该节点逻辑上的下一个节点,数据域存储该节点的数据。给定单链表的头指针,如何判断是否有环?方法一:从头遍历,将每个遍历的节点存储到一个集合中,方法二:使用两个指针从头开始遍历,在一个循环中移动两个指针,指针1每次移动一步,指针2每次移动两步,每次比较两个指针指向的节点是否相同,如果指针2无法再向前移动,说明达到最后一个元素,链 表没有环。否则,一定会出现指针2和指针1相遇的情况,如果出现两个指针指向节点相同,说明链原创 2020-09-08 16:08:09 · 198 阅读 · 0 评论 -
深度优先搜索-全排列问题
# arr为元素数组,n为元素个数,vis为目标存储数组def perm(arr, n, vis): if len(vis) == n: global tot tot += 1 print(vis) # return # 剪枝,如果没有,那么会再得到解之后,继续下面的循环,当然了,下面的循环每一次循环if语句都是False,然后结束。所以这个剪枝,可以解决n!*n次循环。 for i in range(n):原创 2020-09-08 16:04:54 · 202 阅读 · 0 评论 -
深度优先搜索-组合问题
def com(arr, n, k, vis, cur): # cur表示剩下可选的元素范围为cur~n if len(vis) == k: print(vis) return # 剪枝1 if n-cur + len(vis) < k: # 剪枝2 return for i in range(cur, n): # 关键点1,从剩下可选范围内增加元素 vis.append(arr[i])原创 2020-09-08 16:02:50 · 341 阅读 · 0 评论 -
迪克斯特拉算法原理与Python实现
原理找到距离源点src距离最近的点,这个最短距离就是该点的最短距离对这个点的邻居节点做松弛操作:检测这个点是否可以作为它的邻居的最短路径上面的点,如果可以则更新实现def f(G, nodes, src): dist = {} MAX_INT = 99999999999 node_pre = {} for node in nodes: dist[node] = MAX_INT node_pre[node] = src dis原创 2020-09-05 10:50:23 · 455 阅读 · 0 评论 -
【hdoj_1042】N!(大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1042题目说明待求阶乘的数最大为10000,而10000!的位数为35660(这个数是上网查的),所以已经有的数据类型无法表示.思路:用int型数组存储n!的每一步计算结果,并且数组大小应该不小于35660这个数.每一步计算,手动模拟乘法的过程.首先看看乘法的过程.例如,1234原创 2017-03-05 20:59:00 · 988 阅读 · 0 评论 -
【hdoj_1002】A+B Problem ||(大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002题目提示,相加的两个数的位数可能很大(最多可达1000位),而int最多32位,long long类型和__int64类型都是最多64位,均不能存储位数过多的数,所以现有的数据类型无法直接存储.思路:用字符串存储输入的数字,模拟加法的过程,即相加和进位的过程.首先,原创 2017-03-05 15:44:15 · 508 阅读 · 0 评论 -
递归(一)几个简单的递归例子
刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如:1.函数为什么可以在自己的内部又调用自己呢?2.既然可以自己调用自己,那么递归运行过程中一定回有很多层相互嵌套,到底什么时候不再嵌套呢?3.递归运行过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响?递归两个要素1.递归边界2.递归的逻辑——递归"公式"递归的过程一定有参数的变化,并且参原创 2017-03-20 16:15:27 · 115404 阅读 · 20 评论 -
DFS求解迷宫问题(输出所有的路径)
问题:给出一个n*n的迷宫,起点为(0,0),终点为(n-1,n-1).可以向上、下、左、右四个方向走.任务:1.判断是否有可行路径 2.如果有可行路径,输出所有的可行路径.————————————————————————————————————————————————————如下图所示,当前位置为中间点,如果中间点不是终点,那么会从4个方向进行下一步探测,进入原创 2017-03-27 22:00:24 · 26993 阅读 · 9 评论 -
递归打印组合
打印组合问题:给出数n和k(15 4 35 4 25 4 15 3 25 3 15 2 14 3 24 3 14 2 13 2 1如果只是求出组合数,那么就是简单的[单向递归]问题,因为存在递推公式:C(n,k) = C(n-1,k-1) + C(n-1,k)且C(n,1)=n,C(n,0) = 0;但是,[打印出所有组合]比求组合数难度稍大.原创 2017-03-30 22:09:12 · 728 阅读 · 0 评论 -
递归回溯打印全排列(两种方法求解)
打印全排列问题:给定一个数n,要求打印123...n的所有全排列.例如n=4,则所有的全排列为:1 2 3 41 2 4 31 3 2 41 3 4 21 4 2 31 4 3 2......4 1 2 3一共4!=24个.————————————————————————————————————————————————————下面采用[递归+回溯法]求解原创 2017-03-30 23:05:35 · 6762 阅读 · 0 评论 -
八皇后问题(递归+回溯法)
所谓八皇后问题,就是在一个8x8的棋盘上,放置8个皇后,要求任意两个皇后不能相互攻击,即要求任意两个皇后:1.不能在同一行,2.不能在同一列,3.也不能在同一条直线上.如下图:要求出,所有的摆放方式,使得这些皇后不能相互攻击.——————————————————————————————————————————————————本题的思路:列举出所有的排列,然后利用三个会相互攻击的原创 2017-04-02 10:29:12 · 5736 阅读 · 4 评论 -
【hdoj_1010】Tempter of the Bone(迷宫+剪枝)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010题目大意:给出一个迷宫(含起点和终点),要求找出一条路径,这条路径的长度必须为某个规定的长度.在做本题之前,先学习了一下迷宫问题:http://blog.csdn.net/ten_sory/article/details/66975811在理解迷宫问题的基础上,再做本题.本原创 2017-04-02 12:22:48 · 1028 阅读 · 0 评论 -
【hdoj_1015】Safecracker(排列组合)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1015题意:从给定的几个元素选择出符合5个组成一个组合,输出字典序的最后一个符合要求的组合,如果不存在符合要求的组合,则输出"no solution".从若干元素中选择出5个元素,初看是组合问题,其实不是,因为组合问题选择出来的组合没有顺序的要求,如[X Z U B A]和[U X B A原创 2017-04-02 21:17:48 · 1256 阅读 · 0 评论 -
Linux+Sublime 开发C/C++ 中无法读取cin/scanf 的解决办法
https://www.cnblogs.com/xxdfly/p/4692622.htmlUbuntu下用Sublime,加上一些文件配置,可以编译并且运行C++,但可能会有cin无法读入的问题,这个链接可以解决.转载 2018-03-31 21:57:34 · 1488 阅读 · 0 评论 -
最长公共连续子串(Longest Common Substring)
上一篇博客,介绍了最长公共子序列(Longest Common Sequence, LCS),本文介绍最长公共连续子串。与序列不同,子串要求字符是连续的,而子序列可以不连续。下面同样用LCS表示最长公共连续子串。首先分析一下,如果暴力求解法的时间复杂度,两个字符串A和B长度分别为x和y,则字符串的子串个数分别为n1 = x + (x-1) + ... + 1 = x(x-1) / 2n2 = y ...原创 2018-04-08 21:03:15 · 17159 阅读 · 8 评论 -
【hdoj_1003】Max Sum
題目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003题目大意,给定一个数组,a[0], a[1], ..., a[n-1]需要求它的一个连续子序列,使得这个连续子序列的和最大.一、暴力求解方法O(n^3)直观的解法是,遍历所有的连续子序列,取和最大的那个.唯一决定一个连续子序列的指标为序列起始、结束索引,分别设置为i和j则,要求a[i],...,a...原创 2018-04-01 14:04:18 · 3008 阅读 · 2 评论 -
【HDOJ_1029】Ignatius and the Princess IV
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1029大意是,有一个数列,有N个数,N为奇数,有一个数出现的次数>=(N+1)/2,现在要求出这个特殊的数来.思路:思路1.遍历并记录每个数出现的次数,找到次数>=(N+1)/2对应的那个数即可,记录次数的时候有点类似桶排序.思路2.对这个数列进行排序,由于它出现的次数>=(N+1)/2,...原创 2018-04-02 11:30:25 · 224 阅读 · 0 评论 -
最长公共子序列(LCS)
一、概念1.给定字符串str = "ABCDADNENXY" 子序列:从str中任意去掉若干个(含0个)字符,剩下的就是这个str的子序列,如ABC, ABXY, DADXY等,中间不必连续. 子串:和子序列不同,子串必须是连续的,如ABCD,ENXY,CDADNE都是子串,而AXY不是,因为中间断开了,把连续. 子串必定是子序列,子序列不一定是子串.2.最长公共子序列(Long...原创 2018-04-04 16:42:37 · 23866 阅读 · 3 评论 -
并查集原理及Python实现,朋友圈个数问题
背景问题:给定一些好友的关系,求这些好友关系中,存在多少个朋友圈?例如给定好友关系为:[0,1], [0, 4], [1, 2], [1, 3], [5, 6], [6, 7], [7, 5], [8, 9]。在这些朋友关系中,存在3个朋友圈,分别是【0,1,2,3,4】,【5,6,7】,【8,9】如下图所示:这个问题,抽象一下,就是:求一个图的连通子图的个数,即连通度是多少。...原创 2018-07-20 19:54:27 · 7717 阅读 · 11 评论 -
social network社交网络资料汇总
social network资料汇总网络结构无标度网络(BA)度的分布服从幂律分布(二八法则)Python NetworkX库https://www.jianshu.com/p/e543dc63454f社区发现https://blog.csdn.net/u010159842/article/details/80505831https://blog.csdn.net/qq_31852...原创 2019-05-20 16:59:11 · 994 阅读 · 0 评论 -
【hdoj_1051】WoodenSticks
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1051题意可以理解为:给定若干个二元数对,要将这些数对分为不同的组,同一组中的若干个二元数对可以排列成一个顺序,这个顺序使得二元数对按照两个指标中的任意一个指标都是(不严格)递增的,待求的是,在这种分组方式下,最少可以分多少组.思路:可以先按照两个指标中的一个指标(长度)给这些二元数对排序,再依次序原创 2017-02-20 15:21:40 · 215 阅读 · 0 评论 -
【hdoj_1133】Buy the Ticket(卡特兰数+大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1133题目的意思是,m个人只有50元钱,n个人只有100元整钱,票价50元/人.现在售票厅没钱,只有50元钱的人可以不用找钱顺利买票,而拿着100元整钱的人只有在前面有50元的情况下才能买票,因为只有这样,才能找零50元.所有的人能否买票和排队的方式有一定关系,问使得所有的人能够顺利买票的排队方原创 2017-03-06 17:36:12 · 1403 阅读 · 1 评论 -
【hdoj_2570】迷障
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2570思路:贪心法.要求在浓度不超标的情况下,解药的最大体积.由于体积相同,可以先对浓度排序,然后从浓度小的药水开始配制,直到超标的前一次,就可以求出最大体积和对应的不超标的最大浓度.注意:根据题目要求,每种药液,要用就得全用,要么不用,即【不能分割】.C++代码如下:原创 2017-02-23 20:25:33 · 251 阅读 · 0 评论 -
【hdoj_2391】FilthyRich
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2391题目大意:给定一个矩阵,从左上角第一个元素开始到右下最后一个元素,寻找一条路线,使得路线经过的矩阵元素之和加起来最大,路线的方向可以向右→,可以向下↓,也可以斜向右下(只有在矩阵元素有负数的时候,斜向右下的方向才有必要考虑,本题可以考虑这一点,但是没有必要)有两种方法可以求解原创 2017-02-22 15:46:05 · 254 阅读 · 0 评论 -
【hdoj_2187】老人是真饿了
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2187题意:由很多种价格的大米,在经费一定的情况下,买重量更多的大米,并且题目假设经费买不光所有的大米.思路:贪心法,先买价格低的,再买价格高的.所以先按照价格递增将大米排序(结构体排序),然后消耗经费,至到经费用完.C++代码如下#include#include原创 2017-02-22 09:29:42 · 346 阅读 · 0 评论 -
【hdoj_2124】RepairTheWall
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2124思路:贪心法.由于要求所需的块儿(block)的最小数目,先把所有的块儿加起来,看看大小是否>=缝隙L,如果不是,则输出impossible,如果可以,则先用最大的块儿填充,然后用更小的,直到缝隙补齐就停止.C++代码如下#include#includeusing na原创 2017-02-22 08:53:23 · 280 阅读 · 0 评论 -
【hdoj_2111】SavingHDU
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2111题目理解:给出一个口袋的容量,若干种宝物的单价和体积,单个的宝物可以分割,待求的是最多能装价值多少的宝物.思路:宝物可以分割,所以如果宝物足够多的话,口袋可以装满.因此,先对所有宝物按照价格递减排序,然后从高价的宝物开始,把它们放进口袋,直到宝物装完了或者口袋装满了为止.装原创 2017-02-21 16:41:04 · 225 阅读 · 0 评论 -
【hdoj_2037】今年暑假不AC
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2037可以这样理解题意:将每个节目看做是一个区间,起始时间为左右端点,待求的是:最多可以有多少个区间互不相交(注意:[3,5]和[5,7]虽有共同的端点,但是是不相交的).思路:所选择的区间长度(节目时间长短)越小,余下的空余区间就越多,所以长度小的区间,应该先被选中.因此,步骤如下原创 2017-02-21 15:42:53 · 306 阅读 · 0 评论 -
【hdoj_1257】最小拦截系统
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1257可以这样理解题意:给出一组数字,给它们划分组数,划分的依据是,每一组的元素必须是单调递减的顺序,只有这样才能保证一个拦截系统能拦截本组的所有导弹,待求的是这样划分的最小组数.例如389 207 155 300 299 170 158 65的划分过程如下首先,遍历一遍,389->20原创 2017-02-20 16:01:04 · 258 阅读 · 0 评论 -
【hdoj_1050】Moving Tables
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1050题意为:为了叙述方便,把一个房间里面的桌子移动到另一个房间称为一个移动,给出若干个要求完成的移动,任意两个移动仅在移动路线不相交的情况下可以同时进行,求出移动所需花费的最小次数(时间).注意:出现有"对门"的路线,不能同时移动,例如,[2,4]和[3,5]不能同时进行,因原创 2017-02-19 20:32:02 · 257 阅读 · 0 评论 -
详解折半插入排序算法
折半插入排序利用二分法的思想,在一个有序的序列中,找到新元素在该序列中的位置,然后插入。如图1所示,共有n个元素,前i个元素已经是有序序列,现在要将第i个元素插入其中。折半插入排序需要做两步工作:找到待插入元素的位置、插入。图1 插入排序示意图首先要定义两个指针(不是语法里面的指针,是下标的意思)low和high用于寻找a[i]的插入位置,low指向a[0],high指向a原创 2016-06-22 09:23:19 · 1845 阅读 · 2 评论 -
非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度。求解该问题的算法一般为Dijkstra算法。假设图顶点个数为n,则针对其余n-1个点需要分别找出点src到这n-1个点的最短路径。Dijkstra算法的思想是贪心法,先找出最短的那条路径,其次找到次短的,再找到第三短的,依次类推,直到找完点src到达其余所有点的最短路原创 2016-06-26 23:02:14 · 1453 阅读 · 1 评论 -
【hdoj_1009】FatMouse's Trade
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1009本题用到贪心策略和结构体排序。问题简化:现有资本M,N个房间,第i个房间对应着价格为F[i]和收益J[i],需要将M全部花光去投资每个房间,使得收益最大,从每个房间中获取的效益与投入成正比,求最大获益。贪心策略:由于成正比,收益与投资成正比,所以可以考虑“性价比”这个概念,把每个房间当作一原创 2016-06-22 22:43:11 · 758 阅读 · 0 评论 -
【hdoj_1049】Climbing Worm
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1049以 上升-下降 一次为一个周期,一个周期时间为2分钟,每个周期上升距离为(u-d)。先只考虑上升,再只考虑下降。先上升n/u次,再下降n/u次,这样保证不会超过井口,这样上升和下降各n/u次之后离井口距离为 n-(u-d)*(n/u),用时n/u分钟。最后一定会出现这样的情况,离井口的距离用D原创 2016-06-23 11:13:13 · 606 阅读 · 0 评论 -
母函数通用模板
本文内容参考下面的文章:http://blog.csdn.net/xiaofei_it/article/details/17042651看下面的问题:解决上述问题的通用代码模板如下:#includeusing namespace std;//动态内存分配不用memset或memcpy来初始化或复制数组int main(){ int i,j,原创 2017-03-02 10:49:25 · 861 阅读 · 0 评论