![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 74
Daniel_2046
这个作者很懒,什么都没留下…
展开
-
统计完全二叉树的节点数
目录问题分析代码复杂度问题给定一个完全二叉树,统计其中的节点数,要求时间复杂度低于O(n)分析 统计一个二叉树的节点最简单的方法当然是遍历一次,但是这样的时间复杂度是严格的O(n),不满足要求。要更快,自然要在完全二叉树的性质上下功夫。 完全二叉树的最后一层,节点一定是从左向右紧密排列的。由此可以想到什么?完全二叉树里一定有满的...原创 2018-07-23 01:03:11 · 2770 阅读 · 0 评论 -
串匹配问题与KMP算法
目录问题蛮力算法KMP算法-主算法KMP算法-生成next表KMP算法-复杂度分析KMP算法-next表改进问题在现实中经常遇到这样的需求: 给一个较长的串T,长n,和一个较短的串P,长m,设计算法判断P中是否包含T,若有,返回T中和P匹配的子串起点的下标。蛮力算法最容易想到的就是两个串头部对齐,两个指针i、j表示T和P中进行匹配的元素的下标(初始...原创 2018-07-21 17:25:22 · 488 阅读 · 0 评论 -
判断单链表是否存在环,两个单链表是否相交
给出一个单链表,节点结构如下public class Node{ int value; Node next;}要求:判断链表是否有环。若有环,返回入环的第一个节点;若无环,返回null。 快慢指针是链表问题中常用的方法,一个快指针一次走两步,一个慢指针一次走一步。这里利用双指针判断是否有环。无环的情况很简单,fast走得快,如果它遇到null就是无环的。注意判断next和...原创 2018-07-18 13:15:38 · 594 阅读 · 0 评论 -
二叉树的遍历(递归和迭代版)
二叉树常见的遍历方式有先序遍历、中序遍历、后序遍历、层次遍历。首先介绍前三种遍历方式,对于每一个子树,遍历的顺序是 先序遍历:根 ->左子树->右子树 ,如图中① 中序遍历:左子树->根 ->右子树 ,如图中② 后序遍历:左子树->右子树->根 ,如图中③先序遍历: ...原创 2018-07-12 15:30:52 · 648 阅读 · 0 评论 -
有序矩阵查找问题
给一个行和列都排好序的n*m矩阵,判断一个数是否存在于矩阵中,要求时间复杂度O(n+m),空间复杂度O(1)。 遍历肯定太慢了,看到在矩阵中找,就联想到利用有序矩阵的性质一次否决掉一批元素。因为行和列都是有序的,所以对于矩阵中的每一个元素,同一行左面/同一列上面所有的元素都小于等于它,同一列下面/同一行右面所有的元素都大于等于它,所以每次把一个元素x和给定值a进行比较,都可以否决掉x...原创 2018-06-23 17:29:26 · 1179 阅读 · 0 评论 -
Spiral Matrix 问题
这种问题很容易陷入怎么在局部转向的误区,更好的方法还是用逐步缩小问题规模的思路,每次解决一对左上右下坐标(lr,lc)(rr,rc)确定的一圈,一圈一圈往里走,直到把整个矩阵走完。对于每个边长L的圈,每次打印(L-1)长度转向,打印四次。 注意一下边界情况,两个坐标可能在一行或一列,这时候直接向右打印一行或向下打印一列就可以了。 public void printFrame(int[...原创 2018-06-23 15:08:33 · 194 阅读 · 0 评论 -
关于快速排序
快速排序是基于partition过程的排序方法,时间复杂度O(nlogn),是几种O(logn)的排序算法中常系数最小的。 partition顾名思义是划分。选定一个元素a,把所有小于等于a的元素放到a的左边,大于a的元素放到a的右边,这里a左边和右边的区域不需要有序。 经典快速排序算法是每次选定最末尾的元素x,partition之后,x左边的元素都小于等于x,右边的元素都大于...原创 2018-06-13 16:03:52 · 197 阅读 · 0 评论 -
二叉树的先序、中序、后序序列的转化
问题已知二叉树的先序序列pre和中序序列in,求后序序列post。分析 先序序列的结构是:根 + 左子树的先序序列 + 右子树的先序序列中序序列的结构是:左子树的中序序列 + 根 + 右子树的中序序列后续序列的结构是:左子树的后序序列 + 右子树的后序序列 + 根如图所示现在只看先序和中序序列,对于每一个二叉树,都可以划分成这样的形式。这时候得到了左右子树的...原创 2018-08-01 18:27:04 · 6429 阅读 · 0 评论