算法
文章平均质量分 89
Miaoshuowen
这个作者很懒,什么都没留下…
展开
-
极客大学算法训练营毕业总结
1、算法和数据结构脑图2、刻意练习–过遍数切题四件套clarificationpossible solutionscompare(time/space)optimal(学习最优解加强)coding(多写)test cases五遍刷题法:练习缺点、弱点地方,不舒服、枯燥、不爽—就是在进步;①刷题第一遍5-15分钟:读题+思考直接看解法:注意看多解...原创 2019-12-17 23:42:27 · 9108 阅读 · 4 评论 -
二分搜索的例子
二分搜索常见的应用场景1.在有序序列中查找一个数2.并不一定非要在有序序列中才能得到应用二分搜索常见的考察点1.对于边界条件的考察以及代码实现的能力2.在有序循环数组中进行二分搜索二分搜索常见题目的变化1.给定处理或查找的对象不同2.判断条件不同3.要求返回的内容不同二分搜索的重要提醒mid= (left+right)/2 -->可能溢出更安全的写法:mid=lef...原创 2019-09-14 22:50:19 · 265 阅读 · 0 评论 -
关于链表的一些算法
链表和数组一样都是一种线性结构①数组是一段连续的存储空间;②链表空间不一定保证连续,为临时分配的。链表的分类:1.按连接方向分类:①单链表②双链表2.按照有环无环分类①普通链表②循环链表:最后一个节点next指针指向第一个节点链表问题代码实现的关键点:1.链表调整函数的返回值类型,根据要求往往是节点类型;2.处理链表过程中,先采用画图的方式理清逻辑;3.链表问题对于边界条...原创 2019-09-08 23:00:53 · 271 阅读 · 0 评论 -
队列和栈的一些算法
栈和队列的基本性质以及操作:基本性质:1.栈是先进后出的;2.队列是先进先出的;3.栈和队列在实现结构上可以有数组和链表两种形式;①数组结构实现较容易;②用链表结构较复杂,因为牵扯很多指针操作。栈结构的基本操作:1.pop操作:弹出栈顶元素;2.top或peek操作:只访问栈顶元素不弹出3.push操作:从栈顶压入元素;4.size操作:返回元素个数。队列结构的基本操作:...原创 2019-08-29 19:59:20 · 584 阅读 · 0 评论 -
有关字符串的一些算法
例1:给定彼此独立的两棵树头节点分别为t1和t2,判断t1中是否有与t2树拓扑结构完全相同的子树。解:①普通解法:二叉树遍历+匹配问题考察t1中以每个节点为头的子树是否与t2一致,如果N代表t1节点数,M代表t2节点数,则时间复杂度为O(N*M);②最优解为二叉树序列化+KMP算法a.将二叉树t1序列化为字符串str1,t2序列化为字符串str2;b.用KMP算法判断str1中是否含...原创 2019-08-27 19:19:22 · 242 阅读 · 0 评论 -
排序算法中的一些例子
例1:给定一个数组,判断数组中是否存在重复的元素,必须保证额外空间复杂度为O(1)解:如果没有空间复杂度限制,用哈希表实现,先排序,再判断。有限制时,应该采用堆排序来实现。但是经典的堆排序实现使用了递归的方式。递归的方式需要额外的空间(函数栈),所以需要改写成非递归版本。以下将给出两个版本的代码:①递归代码 public void heapSort(int[] a) { // 建...原创 2019-08-17 22:55:27 · 228 阅读 · 0 评论 -
基数排序的简单实现
前言基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。所谓桶排序,就是根据数据关键字建立不同的桶,然后将元素分别插入各个桶。如下图:基数排序,基数即为十进制的位数。基数排序算法过程:①初始化:构造一个10*n的二维数组,一个长度为n的数组用于存储每次位排序...原创 2019-08-14 17:22:24 · 286 阅读 · 0 评论 -
快速排序的简单实现
快速排序的基础思想就是分而治之,通过选择主元将数组分成两段,依次将比主元小的数放在主元左边,比主元大的数放主元右边,当一次主元比较结束时,主元所在的位置就是它的最终位置。如下图,然后递归调用。什么时候是快速排序的最好情况?每次正好中分 ——> T(N)=O(N logN)怎么样选主元是很重要的:这里我们取头、中、尾三数的中位数来做主元;需要注意的是,当我们取到主元后,将主元与数组...原创 2019-08-09 19:41:30 · 330 阅读 · 1 评论 -
堆排序的简单实现及最大堆的插入、删除操作
什么是堆?优先队列:特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而不是进入队列的先后顺序。堆的定义如下:具有n个元素的序列(h1,h2,…,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,…,n/2)时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很...原创 2019-08-13 21:12:52 · 1876 阅读 · 1 评论 -
单源最短路径Dijkstra算法的简单实现
思路:令S={源点S+已经确定的最短路径的顶点Vi};对任一未收录的顶点V,定义dist[V]为S到V的最短路径长度,但该路径仅经过S中的顶点,即路径{S->(Vi属于S)->V}d的最小长度。路径是按照递增(非递减)的顺序生成的,且:a. 真正的最短路径必须只经过S中的顶点;b. 每次从未收录的顶点中选dist最小的收录(贪心算法);c. 增加一个V到S可能影响一个人W...原创 2019-05-20 20:45:35 · 704 阅读 · 0 评论 -
多源最短路径之Floyd 算法的简单实现
基本思想通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离;假设图G中顶点个数为N,则需要对矩阵S进行N次更新。初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。 接下来开始,对矩阵S进行N次更新。第1次更新时,如果"a[i][j]...原创 2019-05-19 20:25:48 · 1148 阅读 · 0 评论