数据结构与算法
吃货小跟班
即将走出象牙塔的菜鸟
展开
-
【数据结构与算法】最大子序列和问题的求解
题目:给一个int类型的数组,就最大子序列的和 解法:一共有四种算法,算法的时间复杂度分别为: 【算法一】 结果是求一个子序列,即其实序列号和终止序列号,那我们就对所有可能的起止序列号的组合进行遍历,求和,找到最大的和以及最大和所对应的起止序列号。这个算 法包括三层循环,最内层循环求和。算法的代码如下: 【算法二】 对算法一进行改进,核心仍然是穷举原创 2017-01-06 10:20:24 · 2041 阅读 · 0 评论 -
【数据结构与算法】最长、短回文子串问题
回文串中有比较特殊的几个点:起点、终点、对称点; 我们在枚举的时候可以枚举所有起点、终点,当然也可以枚举所有的对称点,枚举对称点的情况少一些。但是对称点有两种可能,一种就是某个特定位置的字符,此时回文串的长度为奇数,另一种就是字符的中间位置,此时回文串的长度为偶数,需要进行特殊判断。 【题目1】求最长的回文子串: 【解法】一开始想了两种解决办法,都超时思路:不再枚举起点和终点,而是枚举所有的对原创 2017-01-05 17:20:28 · 462 阅读 · 0 评论 -
【数据结构与算法】求二叉树中两个节点的最近祖先
从根节点开始,当两个节点分别出现在根节点的左、右子树时,则此跟节点就是最近的祖先。若两个节点均在左子树中,则从左子树开始递归,否则从右子树开始递归。那么问题就是,怎么判断两个节点是在左子树,还是右子树呢。 对于二叉查找树来说,这个问题很容易解决,利用二叉查找树的特性,比根节点小的,则在左子树,否则在右子树,则递归只在左子树或者右子树进行。参考代码如下: 而对于一般的二叉树来说,不存在这个特性原创 2017-01-05 17:22:20 · 1232 阅读 · 0 评论 -
【数据结构与算法】求完全二叉树节点的个数
【思路】 满二叉树的点的个数是容易求出来的,而对于完全二叉树来说,左子树和右子树中必存在一个完全二叉树。则问题转换为递归的问题,主要是求左子树和右子树中那个不是满二叉树的节点个数。那么如何判断左子树和右子树中哪个子树不是满二叉树。 若左子树和右子树的高度相同,则说明坐子树为满二叉树。否则说明右子树为高度少1的满儿叉树。 那么如何求高度为h的二叉树的节点的个数?用位移运算。完整参考代码:原创 2017-01-05 17:23:47 · 754 阅读 · 0 评论 -
【数据结构与算法】关于二叉查找树的思考
一定要抓住二叉查找树的中序遍历结果是一个升序数组的特性!对二叉查找树进行中序遍历的结果,就是一个升序的数组,因此很多问题,我们都可以先转到一个升序的数组去考虑,而后对二叉查找树进行中序遍历按,就可以得到同样的结果。 如题目 关键就是要找到二叉查找树中位置交换的两个节点。但是如何找到这两个节点呢? 我们可以考虑一个升序的数组,在一个升序的数组中如何找到两个位置交换的节点呢? 例如对于数组:1,原创 2017-01-05 17:26:06 · 307 阅读 · 0 评论 -
【数据结构与算法】二叉查找树形态的排列组合
【题目1】 【思路】 这个题其实就是在考察,给定n个点,二叉查找树会有多少种形态。形态个数=左子树的形态个数*右子树的形态个数。。而当知道给定左子树节点个数之后,实际上就是一个递归问题了,但是递归的话其实多了很多重复的计算,因此我们用一个数组来保存结果。代替递归。 一开始用递归做,代码,出现超时的错误,后思考,怎么不用递归,用一个数组保存当n分别是1、2、3、。。。。n时的结果。 【代码】【原创 2017-01-05 17:29:12 · 1565 阅读 · 0 评论 -
【数据结构与算法】数组和单链表转平衡二叉树
题目108【1】升序数组转平衡二叉树 【思路】每次都找到数组中间的元素,作为跟节点,左半部分组成根节点的坐子树,右半部分组成根节点的右子树。采用递归的做法。 【代码】 题目109【2】升序单链表转平衡二叉树 【思路1】单链表的话,取中间的元素不容易,因此首先将单链表转化为数组,而后采用上述方法解决。 【代码1】【思路2】 与数组思路相同,每次通过遍历,找到单链表的中间节点和最后的节点原创 2017-01-05 19:07:27 · 561 阅读 · 0 评论 -
【数据结构与算法】Jump Game
【题目】: 【解法】:第一开始,想到的是采用递归的方式,后来出现了栈泄露的错误。后来看了Discuss发现可以使用循环的方式。 [解法1] 从头到尾循环 每次的for循环只循环当前点能到的所有的点,且每次的循环条件都会改变。相当于循环的范围不断扩大,直到末尾。具体代码如下: [解法2]从尾到头循环【题目】: 【解法】: 在上题 [从头到尾的循环] 方法的基础上,找到某一点能到原创 2017-01-05 19:41:18 · 323 阅读 · 0 评论 -
【数据结构与算法】关于排列组合
1、给出数字n,列出所有的排列组合的可能 【题目】: 【解法】: 用递归的方式2、给出一个数组,列出所有可能的排列组合序列(不允许有重复) 【题目】: 【解法】: 3、给出数字n,k,返回所有排列组合序列中的第k个序列 【题目】: 【解法】: 【我自己的:出现了超时的错误】用了最简单的递归,超时了。实际上就是题目1的做法,只不过算到第k个就停止。 【参考另一种原创 2017-01-05 19:59:57 · 2068 阅读 · 0 评论 -
【数据结构与算法】【leetcode】sum2 sum3 sum4 Combination Sum
【题目】:输入:int[]nums int target 输出:符合要求的所有情况 给定一个int类型的数组,sum2、sum3、sum4分别输出2、3、4个元素的和为target的所有结果,不能重复,并且结果从小到大排序。【解法】: 三个题目均可以使用双指针的做法。首先对原始数组进行排序,排序的意义为:(1)保证最后结果的有序性;(2)从小到大的查找是否满足target,若小于他,则star原创 2017-01-05 20:07:26 · 1956 阅读 · 0 评论 -
【数据结构与算法】栈ADT结构应用的例子
1、【平衡符号】:做一个空栈。读入字符直到文件结尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出,如果弹出的符号不是对应的开放符号,则报错。在文件结尾,如果栈非空则报错。2、【后缀表达式】 例如一个计算表示:4*1.6 + 5+6*1.6 写成后缀(逆波兰)记法为: 4 1.6 * 5 + 6 1.6 * + 计算这个问题最容易的方法是使用原创 2017-01-05 21:01:54 · 2194 阅读 · 0 评论 -
【数据结构与算法】斐波那契额数列用for循环实现
采用递归的方法做了很多重复的工作, 而采用for循环的方法,从底层向上运算, f(1)+f(0)->f(2) f(2)+f(1)->f(3) f(3)+f(2)->f(4) 。。。 f(n-1)+f(n-2)->f(n)因此,在循环中只要定义三个变量,便能将最后的f(n)求出来原创 2017-01-06 10:28:42 · 3102 阅读 · 0 评论 -
【数据结构与算法】ArrayList和LinkedList
【ArrayList】ArrayList类提供了ListADT的一种可增长数组的实现。使用ArrayList的优点在于,对get和set的调用花费常数时间。其缺点是新项的插入和现有项的删除代价昂贵。除非变动是在ArrayList末端进行。 !!:ArrayList中有一个容量的概念,它表示基础数组的大小。在需要的时候,ArrayList将自动增加其容量以保证它至少具有表的大小。如果该大小的早期估计原创 2017-01-05 16:18:32 · 437 阅读 · 0 评论