![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
algorithms
文章平均质量分 61
Yohohaha
这个作者很懒,什么都没留下…
展开
-
学点算法(十一)——将二叉树转为数组
今天我们来学习如何将二叉树转为数组(填坑学点算法(九)——二叉树中序遍历算法(递归实现))。首先,我们看下面这棵二叉树,我们从根节点出发,左右孩子依次排列在根节点后面,放入数组中,然后继续以同样的方法遍历其左右孩子,如果孩子节点的位置已经被叔父节点占据,则继续排在叔父节点后面,如果遇到没有左右孩子的情况,则将没有的节点置为null,将节点排列在数组中,直至遍历结束,位于数组结尾的null(后面没有有效节点值)可去除。我们来看下这个过程:首先我们放入1及其左右孩子,得到[1, 2, 3]。取1的左原创 2020-09-22 02:53:21 · 3141 阅读 · 2 评论 -
学点算法(十)——二叉树中序遍历算法(迭代实现)
今天我们继续来学习二叉树的中序遍历算法。在学点算法(九)——二叉树中序遍历算法(递归实现)中我们已经学习了二叉树中序遍历的递归算法,今天我们继续来学习它的迭代算法。我们先来看整个遍历的过程,如图所示:...原创 2020-06-30 15:37:09 · 670 阅读 · 0 评论 -
学点算法(九)——二叉树中序遍历算法(递归实现)
今天我们来学习二叉树的中序遍历算法。二叉树有多种遍历方法,前中序遍历和层次遍历。我们今天的主角是中序遍历,它的遍历顺序为:左子树根节点右子树如下图所示:我们知道树的定义本身就是递归式的,左子树就是一棵以根节点的左孩子为根节点的树,右子树也同理,所以遍历左子树或者右子树直接是把原来的根节点换成根节点的左孩子或者右孩子即可。这样我们可以很快地写出递归的中序遍历算法。import java.util.ArrayDeque;import java.util.ArrayList;import原创 2020-06-29 16:02:18 · 2311 阅读 · 1 评论 -
学点算法(八)——括号匹配算法
今天我们来学习括号匹配算法。作为程序员应该都知道,我们在码代码的过程中,会用到各类括号,无论是{}还是()还是[]。括号都要求成对出现,要不然就会报语法错误。得益于强大的IDE,我们不需要自己去检测括号,如果多写活着漏写了括号,IDE就会提示我们有语法错误,我们改正一下就可以了。那你是否好奇过IDE的这个检测算法是如何实现的呢?接下来我们来分析分析。我们前面提到了可能会有多种括号情况:{}、()、[]等等。我们先只取一种来分析,我们这里取()。见多识广先从简单的开始:0 * (1 + 2) ——原创 2020-06-22 17:14:20 · 2733 阅读 · 2 评论 -
学点算法(七)——十进制数转换为二进制数
今天我们来学习进制转换算法。大家学习计算机或者编程,都会知道计算机处理数据都是基于二进制的,而我们在日常生活中都是使用十进制。如果要用计算机存储数据,肯定要将十进制转化为二进制,或者我们要查数据,要将二进制转换为十进制,那么问题来了:现在有一个十进制数,我们如何将其转换为二进制数呢?比如我们现在有一个数字:1024(预先给定的数字默认用十进制理解)。用十进制表示为:1024(10)=1×103+0×102+2×101+4×1001024_{(10)} = 1 \times 10^3 + 0 \time原创 2020-06-15 22:11:38 · 2607 阅读 · 0 评论 -
学点算法(六)——数组选择排序
今天我们来学习数组的插入排序算法。假设你是一个农场工人,收获了100个萝卜,长短不一,农场主让你从小到大排列好售卖,你应该怎么做?原创 2020-06-12 18:56:22 · 653 阅读 · 0 评论 -
学点算法(五)——使用归并算法求数组的逆序对数
今天来学习归并算法的一个应用,求数组中的逆序对数。首先我们需要知道逆序对是什么东西:在一个数组中,有两个元素,索引小的元素比索引大的元素大,那这两个元素就构成一个逆序对。而一个数组中所有逆序对的个数就叫做逆序对数。暴力求解法我们可以很容易地想出暴力求解的方法:遍历数组,依次取数组中的每一个数,然后与索引排在其后的元素比较,如果比它小,则逆序对数+1,遍历完毕,得到的逆序对数则是数组的逆序对数。代码如下:/** * 暴力求解法求逆序对数 * @param nums 数组 * @return 逆原创 2020-06-08 17:11:53 · 292 阅读 · 0 评论 -
学点算法(四)——数组插入排序
今天来学习数组的插入排序算法。再将算法之前,我们先来想象这样一个场景:我们要上体育课,体育老师要求同学们从高到矮排好队。当同学们都排好队的时候,小甲同学迟到了。这时候小甲同学随便站个地方可不行,因为这样队伍就不是排好的了,所以要将小甲同学插入到队伍中,使队伍重新又是从高到矮排好的。小甲同学对比自己和同学们的身高,找到自己的位置,排到队伍里,就完成了队伍的排序。这个将一个无序元素插入到n个元素的有序集合,使新的(n+1)个元素的集合变成重新有序的动作就是插入排序的基本思想。借助这种思想,我们就可以把一个数原创 2020-06-07 09:23:13 · 296 阅读 · 0 评论 -
学点算法(三)——数组归并排序
今天来学习归并排序算法。归并算法的核心思想是分而治之,就是将大问题转化为小问题,在解决小问题的基础上,再去解决大问题。讲这句话套用到排序中,就是将一个大的待排序区间分为小的待排序区间,对小的排序区间进行排序,然后再去解决大区间的排序,而如何对小排序区间进行排序的时候可以继续使用该方法,将小的待排序区间分为小小的待排序区间… …依次往复。最终将排序区间分为只有一个元素的时候,因为一个元素已经就是排好序的,无需继续切分了,然后我们再依照此结果去解决大区间的排序。假设我们现在有[53, 89, 32, 45,原创 2020-06-02 20:23:01 · 1482 阅读 · 2 评论 -
学点算法(二)——有序数组二分搜索算法
今天来学习一下二分搜索算法。二分搜索算法针对有序数组,如果数组乱序,则无法使用二分搜索法。先来看一下二分搜索算法的运行原理:判断区间是否有效,无效区间则退出循环。取待查找区间的中间位置元素与目标值对比。如果目标值小于中间位置元素,则更新待查找区间索引,到左边子区间继续查找。如果目标值大于中间位置元素,则更新待查找区间索引,到右边子区间继续查找。相等,则找到元素,返回索引。循环退出,返回区间左边索引。我们举个例子直观感受一下:有一个数组[1, 3, 4, 5, 9, 10, 11,原创 2020-05-27 19:56:09 · 315 阅读 · 0 评论 -
学点算法(一)——ArrayList内部数组实现元素去重
在ArrayList中,内部实际存储的元素的是数组,要实现元素去重,即是对改数组进行去重。常规思路是借助外部数据结构,如HashMap等来实现数据查找是否存在后去重,这里我们来实现一个利用内部自身数组的去重方法。为了简要说明,我们自己来实现一个ArrayList,省略泛型实现,并且只实现add和remove方法,用来添加元素和删除元素,最后再实现我们要讲解的deduplicate去重方法。MyArrayList实现public class MyArrayList { private int s原创 2020-05-18 23:41:09 · 385 阅读 · 0 评论 -
算法学习——算法复杂度分析
时间复杂度分析规则单端代码:只关注循环执行次数最多的一段代码多段代码:加法法则,总复杂度等于量级最大的那段代码的复杂度嵌套代码:乘法法则,嵌套代码的复杂度等于嵌套内外代码复杂度的乘积多规模代码:多个参数控制的则将多个复杂度相加常见时间复杂度O(1)O(logn)O(n)O(nlogn)O(m+n)O(m*n)空间复杂度分析略...原创 2019-08-04 17:44:42 · 835 阅读 · 0 评论