算法
runrun117
这个作者很懒,什么都没留下…
展开
-
算法总结
1、一个数组中一个数的数量超过数组长度的一半。 过半数问题,思路:循环数组,得到一个次数就+1,循环看下一个,若果相同就再+1不同就-1.如果次数为0,就把新循环的数作为下次比较的对象,初始给他次数为1,下次比较如果相同+1,不同-1.设置两个变量,一个是放数组当前>0次的数值k,一个放出现的次数j,出现一次+1,不同-1.判断是否=0,=0表示k需要新的数值比较。当最后j>0时...原创 2018-03-25 08:35:39 · 154 阅读 · 0 评论 -
堆排序 快排 使用场景
堆排序比较和交换次数比快速排序多,所以平均而言比快速排序慢,也就是常数因子比快速排序大,如果你需要的是“排序”,那么绝大多数场合都应该用快速排序而不是其它的O(nlogn)算法。但有时候你要的不是“排序”,而是另外一些与排序相关的东西,比如最大/小的元素,topK之类,这时候堆排序的优势就出来了。用堆排序可以在N个元素中找到top K,时间复杂度是O(N log K),空间复杂的是O(K),而快速...转载 2018-05-28 11:01:30 · 13988 阅读 · 3 评论 -
二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵
查找某元素假设矩阵为 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在里面查找7,如果我们从1开始,则1的右半部分,也就是剩下矩阵的全体,都可能会存在7,这是显然不...转载 2018-05-15 08:09:31 · 1182 阅读 · 0 评论 -
二叉树遍历递归或者非递归
二叉树的定义:二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有一个根节点 3.只有左子树 4.只有右子树 5.左右子树都存在 有且仅有这5中表现形式 二叉树的特点:性质1:在二叉树的第i层上至多有2^(i-1)个节点(i >= 1)性质2:深...转载 2018-05-14 07:38:10 · 167 阅读 · 0 评论 -
【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种。看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解。比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优的问题,怎样修才是做好的,如下图:第一个是网全图,后三个图的修路方案都可以1.树的定义:有n个顶点和n-1条边,没有回路的称为树生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是...转载 2018-05-14 07:06:33 · 1012 阅读 · 1 评论 -
如何判断单链表中有环及证明过程
问题:1.如何判断单链表里面是否有环?算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。这里主要理解一个问题,就是为什么当单链表存在环时,p和q一定会相遇呢?假定单链表的长度为n,并且该单链表是环状的,那么第i次迭代时,p指向元素i mod n,q指向2i mod n。因此当i≡2i(mod n)时,p与q相...转载 2018-05-13 09:02:41 · 778 阅读 · 0 评论 -
判断两个链表是否相交并找出交点
问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。思路:1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表...转载 2018-05-13 08:46:52 · 1102 阅读 · 0 评论 -
排序算法之 堆排序 及其时间复杂度和空间复杂度
堆排序是由1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap Sort ); 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全...转载 2018-05-12 07:27:41 · 21272 阅读 · 3 评论 -
LRU 与 LFU 缓存数据算法
2. LRU2.1. 原理LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。2.2. 实现最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:1. 新数据插入到链表头部;2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3. 当链表满的时候,将链表尾部的数据丢弃...转载 2018-05-12 07:07:12 · 351 阅读 · 0 评论 -
青蛙跳台阶问题
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?分析:1)当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;....... ...转载 2018-05-11 15:35:24 · 105 阅读 · 0 评论 -
Sliding Window Median 滑动窗口中的中位数 解题报告
1 解题思想题目会给一个数组,和一个滑动窗口的大小K,让你找出当这个窗口滑动的过程中,这个K的窗口内的中位数分别是多少?最naive的方式就是在k个窗口内排序就好,这里不解释(因为开销很大啊,(n-k+1) * (k*log(k))。。这里的方法是使用两个优先队列,即出队列的顺序是按照某种排好序的方式进行的。 所以我们设立两个优先队列,这里叫做堆吧: 1、最大堆,值大的先出来 2、最小堆:值小的先...转载 2018-05-28 12:54:36 · 1917 阅读 · 0 评论