算法
文章平均质量分 69
一些算法的介绍和实现
泰克尼客
这个作者很懒,什么都没留下…
展开
-
合并两个有序链表的方法
什么是合并两个有序链表假设有两条链表,这两条链表分别都是升序排列的,如下图所示:现在要求将二者合并成一条链表,并且该链表也是升序排列的,合并后的链表如下图所示:思路如果对归并排序有所了解,那么这个问题就很简单。在归并排序的递归过程中,我们的算法是将原始数组a切割成两段:a1和a2,对a1和a2分别排序后,再将二者归并成一个有序的数组。这里的思路是一样的,只不过将数组变成了链表。大体的思路是:确定合并后的新链表的头节点head使用一个指针l3,初始化为head,用这个指针来组织新链表的各个原创 2021-04-29 18:51:40 · 4212 阅读 · 0 评论 -
难倒Homebrew发明人的翻转二叉树到底有多简单?
什么是翻转二叉树大家都知道Homebrew发明人Max Howell面试谷歌时,被一道翻转二叉树的题目给难倒了。那么什么是翻转二叉树呢?看看下图就明白了。简单地说,就是对于一棵二叉树及其所有子树,交换其左右位置。思路首先,看到一棵二叉树时,我们不要被庞大的分支结构所吓倒,其实,其基本构成就是根节点、左子树、右子树这三个元素而已。大多数问题只需要考虑这三者之间的关系就能被解决;其次,对于树相关的问题,我们的第一反应是尝试能否通过递归的方法来实现。理清了二叉树的基本结构(根节点、左子树、右子树),原创 2021-04-29 18:50:32 · 530 阅读 · 0 评论 -
反转链表及其考察的知识点
什么是反转链表如下图所示,原来的链表指向性是从第一个节点1依次指向最后一个节点5,反转链表后,要让原来的链表中的最后一个节点变成第一个节点,并逆转整个链表的指向性。考察的知识点链表相关的操作,难度都不大,但很能够考察思维的严密性,主要体现在:处理每个节点时,各个操作的先后顺序;边界情况的考虑,例如,对于头节点和尾节点的考虑是否完善。如果能充分考虑以上两点,那么链表相关的操作就大体没有问题了。思路当我们遍历到某一个节点cur时,面临的情况如下:根据题意,我们的目标是:让cur节点原创 2021-04-29 18:49:10 · 183 阅读 · 0 评论 -
栈的最简应用:leetcode #1544之整理字符串
什么是栈?栈是大家很熟悉的一种数据结构了,人们之所以使用栈,就是为了使用其后进先出的特性。入栈和出栈是栈的两个灵魂操作。如图所示,以Python中的list模拟栈结构,原始list是[1,2],通过两次push()操作,我们先后将3,4这两个元素加入到list中,这个操作被称作压栈,之后我们再对list施加两次pop()操作来模拟出栈,值得注意的是,元素4虽然是最后被压栈的元素,但却是第一个出栈的元素,这就是我们所说栈结构的后进先出的特性。leetcode #1544之整理字符串原题如下:给你原创 2021-04-29 17:21:59 · 197 阅读 · 4 评论 -
汉明距离及其高效计算方式
什么是汉明距离下面引用自维基百科:在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。对于两个数字来说,汉明距离就是转成二进制后,对应的位置值不相同的个数。例如,假设有两个十进制数a=93和b=73,如果将这两个数用二进制表示的话,有a=1011101、b=1001001,可以看出,二者的从右往左数的第3位、第5位不同(从1开始数),因此,a和b的汉明距离是2。原创 2021-04-29 17:19:05 · 4211 阅读 · 0 评论 -
十分钟简明易懂搞定堆排序算法,附Python源码
什么是堆(heap)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个节点对应数组中的一个元素,而且是从左向右填充。从上述描述,我们可以做出总结:从存储的角度来看,堆是一个数组从结构的角度来看,堆是一棵完全二叉树举例:有一个数组A=[2, 9, 5, 3, 6, 7, 19, 1, 4, 8],那么可以把这个数组看作如下图所示的二叉树:从上述定义中,自然会引申出一...原创 2020-01-14 19:06:20 · 259 阅读 · 0 评论 -
如何从股市曲线看出买进卖出的最佳时期?利用Python和分治策略轻松搞定
问题描述如果我们进行过投资行为,都知道一个简单的原则:低价买进,高价卖出。例如下图所示的曲线,股票价格是一直在波动的,我们想知道哪天买入,哪天卖出,收益最高。如下图所示,是一个很好的示例:这个问题的实质是要求出一个最大子数组,使得首尾两个元素的差值最大。思路为简化问题,我们把原始数组[100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 10...原创 2019-12-30 19:48:13 · 828 阅读 · 0 评论 -
归并排序算法的Python实现
思路归并排序算法使用的是典型的分治思维。要对一个数组A排序,那么可以将这个数组分成两个部分B和C,对B和C分别排序后,再将B和C按顺序进行归并。这种分治的思想可以很轻松地应用到MapReduce架构。由于B和C的排序过程是彼此独立的,因此可以进行并行运算(对应于Map的过程),而B和C的归并过程则可以通过Reduce实现。归并排序排序是一个递归的过程,需要将原始序列不停地拆分成两个小序列,直...原创 2019-11-28 19:36:10 · 249 阅读 · 0 评论 -
插入排序算法的Python实现
思路这里假定对一个数组里的数据进行非递减排序,思路如下:在原始数组上操作总共两层循环第一层循环,从原数组第二个元素开始,正序遍历到数组最后一个元素,每次进行下述第4步的操作第二层循环,从当前元素逆序遍历到数组开始位置,让当前元素和前一个元素比较,如果当前元素小于前面一个元素,则交换这两个元素,否则立即终止循环这个过程类似于玩牌时,每抓到一张新牌,就把这张新牌按大小顺序插入到原始牌序...原创 2019-11-25 10:30:24 · 416 阅读 · 0 评论