算法
文章平均质量分 65
风一样的美代码
这个作者很懒,什么都没留下…
展开
-
设计一个具有获取最小值(getMin)方法的栈
一、题目描述实现一个特殊的栈结构,该栈在具有一般栈的结构的基础上还具有获取栈最小元素的功能。二、题目要求1.栈的pop、push、getMin操作的时间复杂度均为O(1);2.设计特殊栈的时候可以使用现成的栈作为工具去完成。三、题目解析题目要求提醒我们可以使用现成的栈的数据结构,其实也就是告诉我们要使用其作为工具去构建我们的特殊的栈,因为其getMin操作是O(1),因此告诉我们其操作肯定不是在自己的栈里瞎折腾,因此我们需要两个栈,一个用来存储基本数据,另一个用来存储getMin操作原创 2020-05-17 15:27:44 · 1071 阅读 · 0 评论 -
使用记忆搜索方法优化暴力递归(通解)
题目:给定一个数组arr,arr中所有的值均为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有几种方法?一、暴力搜索方法一个案例:arr={5,10,25,1} aim = 1000解法思路:1.先用0个5,让[10,25,1]组下剩下的1000,最终的方法数记为 res12.用一个5,让[10,25,1]组下剩下的9...原创 2019-05-22 17:06:00 · 817 阅读 · 0 评论 -
约瑟夫环基本和进阶解法
问题抽象:其实就是一个环形单链表问题输入:一个头节点和报数的值m返回:最后生存下来的节点自己成环进阶:如果想在事件复杂度为O(N)的条件下解法/public class JosephusKill {/普通解法:1.如果链表为空或链表节点数为1或m的值小于1 就直接返回头节点2.环形链表中不断循环让每个节点不断的进行报数3.当报数为m删...原创 2018-12-06 14:28:07 · 982 阅读 · 0 评论 -
求斐波那契数列的三种方法
什么是斐波那契数列,1,1,2,3,5,8,13...这样一个数列就是斐波那契数列,求第n项的值。一、经典求法观察数列可得,除了第一项和第二项,所有的数列的值都是前一项和前一项的前一项的加和,转换成函数也就是f(n) = f(n-1) + f(n-2)public static int f1(int n) { if(n < 1) { return 0;...原创 2018-07-05 21:49:00 · 124012 阅读 · 15 评论 -
朴素模式匹配与KMP模式匹配算法
一、朴素模式匹配朴素模式匹配算法就是遍历主串,然后把待匹配字符串与子串进行比对,先把待匹配子串的第一个字母与主串进行匹配,若匹配成功,则两串的坐标依次 ++,匹配不成功时,主串坐标返回到开始匹配时的坐标,待匹配串坐标清零,若待匹配坐标等于待匹配子串长度,则证明匹配成功, 返回匹配完毕主串的第一个坐标,否则返回-1假设主串的长度为N,待匹配串的长度为M,因为需要遍历主串,每次匹配的长度都小于等于M,...原创 2018-07-02 10:15:42 · 4489 阅读 · 1 评论 -
图的广度与深度优先遍历(Java)
一、图的广度(宽度)优先遍历定义:其实就是离源节点近的节点先输出,远的节点后输出。图的广度优先遍历是依靠队列来实现的。import java.util.HashSet;import java.util.LinkedList;import java.util.Queue;/** * 图的广度优先遍历(BFS): * 是使用队列这个数据结构来完成的 * 逻辑实现:我们先构建一个队列,先把源节点进入队列...原创 2018-06-19 18:50:47 · 3544 阅读 · 1 评论 -
二分查找的递归与非递归实现
二分查找是一个非常常用的查找方式,它的时间复杂度是O(log n)的,比顺序查找时间复杂度为O(n)要好的多,也非常简单,下面我们来讨论一下它的逻辑实现:狭义上的二分要求我们的元素要先有序才行,广义上的二分我们以后有机会再讲,其实它的思想就是,每次取数组的一半,看中间的元素是否使我们所要寻找的,是,则返回该元素所在下标,不是,则看该元素与中间元素的大小比较,要是该元素比中间元素小,则寻找范围的上界...原创 2018-06-19 09:53:55 · 391 阅读 · 0 评论 -
卡特兰数及其使用典型例子
卡特兰数是一个常用在计数情况中使用的一种特殊的数列,其原理如下:一、原理若令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)(可以写成通式:)例:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h...原创 2018-05-31 19:20:29 · 3588 阅读 · 0 评论 -
解决哈希冲突的三种方法(拉链法、开放地址法、再哈希法)
上篇博客我们说到了,什么是哈希冲突,其实就是再采用哈希函数对输入域进行映射到哈希表的时候,因为哈希表的位桶的数目远小于输入域的关键字的个数,所以,对于输入域的关键字来说,很可能会产生这样一种情况,也就是,一个关键字会映射到同一个位桶中的情况,这种情况就就叫做哈希冲突,解决哈希冲突的有三种方案,一种叫做拉链法(也叫作链接法、链地址法,一个意思),另外三种分别为开发地址法和再散列法。一、拉链法...原创 2018-06-12 10:16:57 · 62297 阅读 · 18 评论 -
九大排序的相关记忆口诀(持续更新)
不分析,不解释,一句口诀送给你:不稳定:快选堆希稳 定:插冒归基原创 2018-06-03 11:23:43 · 15695 阅读 · 4 评论 -
桶排序(计数排序)原理以及java实现
原来我所介绍的排序都是基于比较的排序,例如快排、堆、归并等等,而桶排序不是基于比较的排序,而是一种基于的是数据状况的排序,桶排序其实是已知要排序的数据所在的区间,把该区间均匀分成n个桶,这n个桶包含要排序的数的所有结果,我们把相应的结果放到相应的桶里,然后再按次序把每个桶里面的数据倒到一个数组里,这个数据就有序了。很明显,他的时间复杂度是O(n)和空间复杂度是O(n),因为桶排序的桶(就是一种容器...原创 2018-03-28 10:47:59 · 658 阅读 · 0 评论 -
堆排序详解(java实现)
堆排序可以看成是对简单选择排序的改良,因为简单选择排序每次都要比较n-1次,当然第一次无可厚非,但是它是没有记忆性的,就是很多比较在之前都已经做过了,但是由于这些比较操作并没有被记录下来,所以后面再进行一趟排序的时候又得再把这些操作再进行重复操作,浪费了很多资源。如果可以做到每次选择到最小记录的同时,又根据比较结果对其它记录做出调整,那么这种排序的效率就会非常高了,而堆排序就是这种非常好的排序算法...原创 2018-03-14 10:01:23 · 415 阅读 · 0 评论 -
快速排序原理以及Java实现
为什么要学习快速排序:我们知道,希尔排序相当于直接插入排序的升级版,他们同属于插入排序类,堆排序是简单选择排序的升级,同属于选择排序,快速排序则是最慢排序冒泡排序的升级,同属于交换排序类,就是通过不短的比较和移动交换来实现排序的,只不过他的实现增大了记录比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数。对于一个包含...原创 2018-03-18 16:26:57 · 677 阅读 · 0 评论 -
master公式(主方法)
·master公式(也称主方法)是用来利用分治策略来解决问题经常使用的时间复杂度的分析方法,(补充:分治策略的递归解法还有两个常用的方法叫做代入法和递归树法,以后有机会和亲们再唠),众所周知,分治策略中使用递归来求解问题分为三步走,分别为分解、解决和合并,所以主方法的表现形式:T [n] = aT[n/b] + f (n)(直接记为T [n] = aT[n/b] + T (N^d))其中 ...原创 2018-03-11 15:36:17 · 19083 阅读 · 7 评论 -
递归思想详解以及归并排序(java实现)
为什么引出归并算法呢,我们知道堆排序是利用完全二叉树的深度log2 n 向下取整再加一的特性,所以效率比较高。但是堆结构的设计相对比较复杂,但是又因为利用二叉树来进行排序的算法效率一般都比较高,所以我们引出利用二叉树特性的归并排序来进行数据的排序。什么是归并排序:归并排序就是利用归并的思想把一组数据,首先分解成n个长度为一的序列,其每个序列都是有序的,然后两两归并,得到n/2向上取整个长度为2或者...原创 2018-03-15 21:44:32 · 693 阅读 · 1 评论 -
选择排序和插入排序(Java实现)
1.选择排序选择排序就是进行n-1轮比较 每轮比较至多交换一次 先设最小值为本轮比较初始值 然后比这个值小的就变为最小值,最后那个肯定是本轮最小值的坐标,然后看初始最小值和最后的最小值得坐标是否相同,若不同则交换位置,相同则不交换代码如下:int i,j,min;for(i = 0;i<a.length-1;i++){ min = i; for(j=i+1;j<a.length-i-1...原创 2018-03-14 20:01:33 · 824 阅读 · 1 评论 -
冒泡算法以及其改良(java实现)
冒泡排序是一种非常简单的排序算法,核心思想就是相邻的两个记录进行两两比较,如果不满足排序条件就交换,满足就不交换,例子:给定一个数组aint i,j;for(i=0;i<a.length-1;i++){ //要注意的是-i是因为最下面的i个数已经排好了没必要再排了 for(j=0;j<a.length-i-1;j++){ //注意判断条件,这个与我们想要的结果相反 if(a[j]&...原创 2018-03-14 19:58:56 · 183 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度
你在北方的寒夜里四季如春,我在南方的艳阳里冻成傻逼,作为一名刚从北方放假回到南方的学生党,此时感觉受到了100t的伤害~(咳咳~不扯了,我在被窝的远方瑟瑟发抖的掏出小手写的这波帖子,求安(dian)慰(zan))。书归正传哈,今天咱们要讲的就是算法的时间复杂度和空间复杂度,众所周知,算法是一个程序的灵魂,程序写的好与坏,关键在于它的执行效率要快,所占内存空间要小,因此要想对于某个问题得到最有效原创 2018-01-10 14:09:14 · 585 阅读 · 0 评论