![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
左神算法专栏
韩浩楠
这个作者很懒,什么都没留下…
展开
-
左神算法笔记(十一)——图
图的存储方式:邻接表,邻接矩阵邻接表:邻接矩阵:具体的方法和定义可以参考图论中的内容。宽度优先遍历和深度优先遍历宽度优先遍历:利用队列实现从源节点开始依次按照宽度进入队列,然后弹出每弹出一个点,就把该节点所有没进过队列的邻接点放入队列直到队列变空BFS:public static void bfs(Node node){ if(node == null){ re...原创 2021-09-24 09:54:52 · 280 阅读 · 0 评论 -
求最大子矩阵代码详解
思路为原创 2020-02-25 16:28:59 · 222 阅读 · 0 评论 -
直观打印二叉树
public class Code_02_PrintBinaryTree { public static class Node { public int value; public Node left; public Node right; public Node(int data) { thi...原创 2020-02-17 19:40:25 · 151 阅读 · 0 评论 -
桶排序及基数排序(bucketSort and RadixSort)代码分析
桶排序(bucketSort)代码分析:对于桶排序代码思路较为简单:1. 求出数列中的最大值2. 设计桶的数目等于最大值加一(因为是非负数数据,所以不存在无穷的情况,分析出最大值的情况下,数据最大能够达到的也就是max,最小为0)3. 将整数数据放入到桶中,此时数据一旦放入到桶中一次,则桶的计数加一(记录着这个桶中一共有多少个数据)4. 利用for循环将数据重新排列好赋值给arr,完成排...原创 2020-02-14 21:54:36 · 234 阅读 · 0 评论 -
生成对数器
// for test 绝对正确的方法,对于其他算法则在此处可以实现该绝对正确的算法public static void comparator(int[] arr) { Arrays.sort(arr);}// for test 用于产生任意的数组public static int[] generateRandomArray(int maxSize, int maxValue)...原创 2020-02-13 21:45:41 · 298 阅读 · 0 评论 -
堆排序代码及注释
冒泡排序冒泡排序本身其实没有什么必要理解的地方,整体思路是将最大的值依次遍历到最后的位置,从而实现整体数组的排序。public static void bubbelsort(int[] arr){ if(arr == null || arr.length<2){ return; } for(int e = arr.length-1;e>0;...原创 2020-02-13 21:18:14 · 157 阅读 · 0 评论 -
左神算法笔记(二十四)——扩展题目
题目一思路整体思路是形成一个双端队列,利用双端队列如果当前队列中的数值小于等于当前值,就向右方扩展,如果大于则将左边的数值去掉。之所以可以采用双指针在于数组中的数据全部都是正数,则指针增加则会增加,左指针增加则数据减少代码public static int getMaxLength(int[] arr,int k){ if(arr == null || arr.length == n...原创 2020-02-11 11:03:04 · 251 阅读 · 0 评论 -
左神算法笔记(十)——暴力递归改动态规划扩展
题目一暴力递归暴力递归的复杂度太高,中间存在很多的重复计算,比如0张200,2张100后面的情况跟1张200,0张100后面的情况数目相同,但是暴力递归不考虑这个问题,所以需要进行修改。public static int coins1(int[] arr,int aim){ if(arr == null || arr.length ==0 || aim <0){ return ...原创 2020-02-10 19:32:05 · 474 阅读 · 2 评论 -
左神算法笔记(九)——前缀树扩充
题目一给定一个数组,求子数组的最大异或和。一个数组的异或和为数组中所有的数异或起来的结果。思路之前做个一个找到异或和为0的最长子数组,思路是将每一个节点当做异或和的最后一个节点,求解最长的子数组。同样这个题目可以以这种方法解决。以i位置结尾的最大异或和的值,最大的异或和一定包含在其中。暴力解法就是从0-i,1-i,2-i。。。进行遍历,求解出以i为末尾的最大异或和的值,不断遍历,求出最后的...原创 2020-02-10 10:27:26 · 215 阅读 · 0 评论 -
左神算法笔记(二十三)——跳表
跳表可以认为同样包含key和value,可以完成任何红黑树包含的操作。同时代价也是O(logN)。但是底层不是数结构,比较魔性,但是也好实现。跳表思想:key包含多少层,不是由key本身决定的,而是随机的。随机函数只包含0和1,roll出1时最少层数确定,第几次roll出1,则系统最小有几层。数据插入:重新roll,得到该key的层数,此时从高层开始计算数据是否应该插入该位置,算得位置后,...原创 2020-02-09 22:10:30 · 428 阅读 · 0 评论 -
左神算法笔记(二十二)——字符串加减乘除计算
平时需要将容易出错的地方和边界条件都需要关注,在刷题的过程中需要将特殊情况进行标记,多积累特殊的情况,面试官询问对于算法如何检查之类的可以先回答比较器,同时需要回答需要关注的特殊情况和边界条件。字符串加减乘除实现思路整个式子分为两种情况:1. 没有括号:新建一个栈,将数字和符号都放到栈中,如果顶端的符号是+或者-,则此时可以放入数字,如果顶端字符是或者/,则此时将最后放入的或/和符号下的...原创 2020-02-09 20:17:16 · 1485 阅读 · 0 评论 -
左神算法笔记(二十一)——LFU缓存算法实现
LFU(Least Frequently Used):淘汰最近访问频率最小的元素。思路设计思路:两个双向链表,横向的双向链表用来统计访问频率,纵向的双向链表,没出现过的元素出现在横向链表的头结点上,如果一直增加没有访问,则将元素全部挂到头结点的下方,纵向形成双向链表。横向链表中统计访问的频率,如果增加某个节点的访问一次,则横向链表判断访问总次数是否存在,如果存在,则将节点放到该次数节点的下方...原创 2020-02-09 17:45:49 · 349 阅读 · 0 评论 -
左神算法笔记(二十)——LRU缓存算法实现
LRU思路准备两张表,一个哈希表,一个双向链表。假设A,3存入表中,则map中key还是原始的key,key=A,value加工一下,包括A和3.对于双向链表从尾部加,从头部出。如果需要将某个元素从拿出,则此时将需要拿出的元素拿出,放到链表的最后,此时,该元素优先级最高。如果缓存大小超过了k,此时将双向链表的头结点拿出,取出其中的key,使得原来map中删除该元素,将新的元素放入map中...原创 2020-02-09 15:49:20 · 443 阅读 · 1 评论 -
左神算法笔记(十九)——树型DP(动态规划)
题目一求整颗二叉树的最大搜索二叉子树逻辑:将整个题目转成以每个节点作为头的最大搜索二叉子树,最大的搜索二叉子树一定在其中。基本二叉树的题目都可以利用这样的思想进行求解。思路思路:当前节点的最大搜索子树可能来自于左子树的某个子树,右子树的某个子树,左子树是搜索二叉树,右子树也是搜索二叉树,并且左子树的最大值小于我,右子树的最小值大于我,则以我为头为整个搜索二叉子树主逻辑:对每个节点进...原创 2020-02-09 12:02:13 · 377 阅读 · 0 评论 -
左神算法笔记(十八)——平衡搜索二叉树
搜索二叉树搜索二叉树:对于搜索二叉树的任何一个节点,左子树的值都比节点小,右子树的值都比他大。TreeMap中,跟HashMap中一样可以提供key-value,同时会将key按照大小顺序排列。中间采用的就是搜索二叉树的知识。具备平衡性的搜索二叉树:AVL树——平衡性最严格任何一个节点的左子树和右子树高度差不大于1,复杂度还是O(logN)。导致调整非常频繁。红黑树——平衡性要求不严格...原创 2020-02-09 08:57:04 · 514 阅读 · 0 评论 -
左神算法笔记(十七)——morris遍历(二叉树)
原本二叉树算法中的痛点:二叉树之中,无论时间复杂度如何,空间复杂度为O(h),h为二叉树的高度。morris算法将二叉树的空间复杂度变为O(1),同时时间复杂度不变,依旧保持O(n)。算法流程:现在的当前节点记为cur,如果cur无左孩子,则cur向右移动,cur=cur.right如果cur有左孩子,则找到左子树上最右的节点,记为mostright1)如果mostright的右指针...原创 2020-02-08 11:51:34 · 431 阅读 · 0 评论 -
左神算法笔记(十六)——单调栈结构
单调栈解决的问题单调栈解决的问题是在一个数组中想知道所有数中,左边离他近的比他大的和右边离他近的比他大的数思考的问题:如果知道所有数上得到上述要求,同时复杂度满足O(N)。单调栈结构:单调栈内,从栈底到栈顶满足从大到小。例如:5(0)4(1)3(2)6(3)后面括号代表所属位置入栈的过程:5(0)压入栈然后4(1)比5(0)小,所以将4(1)压入栈中 第三步因为3(2)比4(1)小,...原创 2020-02-07 22:03:49 · 613 阅读 · 0 评论 -
左神算法笔记(十五)——窗口
窗口概念本身并不难理解,窗口从左向右滑动,窗口本身相当于一个固定长度的窗子,依次向右边滑动,从而在中间会有左边减值,右边增加值。窗口内最大值的求解双端队列,代价都是O(1),不需要这个结构表示第几个数是最大值,只需要双端队列可以依次增加或减少数值。双端队列中每次保存两个值,当前的数值和当前的位置信息。加数的逻辑:每次小的值从右边进入双端队列,整个队列形成从大到小排列的顺序。如果...原创 2020-02-07 16:32:08 · 286 阅读 · 0 评论 -
左神算法笔记(十四)——BFPRT算法
解决的问题:在一个无序数组中找到第k小的数快排解法:随机选择一个数,利用荷兰国旗问题,将数据分为小于等于大于三块利用区分好的数组计算长度,看是否命中,否则看是在哪个块中,在确定块中继续划分,重新回到1。对于这种解法而言,如果最差情况是O(N^2),一般情况下,用master公式计算出,最好是O(N)。最后的数学期望是O(N)。暴力解法:将整个数组全排列,形成一个有序数组,然后再找到...原创 2020-02-07 11:59:46 · 442 阅读 · 1 评论 -
左神算法笔记(十三)——Manacher算法
在一个字符串中找到最长的回文字符串以每个位置作为中心,向两边扩展,可以确定奇回文,但是偶回文无法这样做。解决方法:在字符串中间及两边插入某种字符,此时可以按照这种方法进行扩展。此时无论奇回文还是偶回文都可以找到。例如11211,此时添加任意字符在两边#1#1#2#1#1#此时均可以进行回文判断。补充概念:回文直径:以一个位置为中心,扩出来整个串的长度为回文直径回文半径:以一个位置为中心...原创 2020-02-07 10:30:04 · 395 阅读 · 0 评论 -
左神算法笔记(十二)——KMP算法
KMP算法详解与应用解决原始问题:str1和str2为两个字符串,其中str1中的某个子串是否等于str2.明确定义子序列可以不连续,子串/子数组一定是连续的。(中间可能会出现混用情况,必须要区分清楚)getIndexOf(str1,str2)就是str2是否包含在str1中,包含返回true,不包含返回false。中间其实就采用了KMP算法。暴力算法:将str1从最开始的位置开始配,如果...原创 2020-02-06 21:50:29 · 507 阅读 · 0 评论 -
左神算法笔记(十)——递归和动态规划
递归和动态规划介绍求n!的结果原创 2020-02-06 10:55:30 · 373 阅读 · 0 评论 -
左神算法笔记(九)——前缀树
前缀树前缀树用上图进行理解,其中节点均用圆圈表示,“abc”等字符加入到整棵树中作为路径加入,而不是以节点形式加入,同时每个字符在加入时均从头结点出发,因此可以看到“abc”和“bce”为两个分支,同时“abc”和“abd”前半段为一个分支,最后形成两个分支。扩充功能:1.将加入的字符以路径的形式加入节点可以存放是否为字符串结束为止的信息,从而可以在加入“be”这种跟之前走过的路径相同,但是...原创 2020-02-05 11:29:07 · 318 阅读 · 0 评论 -
左神算法笔记(八)——哈希表
认识哈希函数和哈希表哈希函数经典的哈希函数的输入域是无穷大的哈希函数的输出域是有穷尽的,虽然很大,但是是个固定的数值当输入参数固定的情况下,得到的输出参数是固定的,他不是随机函数,样本固定得到的输出值也是固定。输入不一样,也有可能得到相同的哈希值(哈希碰撞)虽然会有两个输入对应同一个输出,但是对于大量的输入对应的输出域基本是平均分的即S域上均匀分布。推论:对于输入对应的哈希值,使其...原创 2020-02-04 15:00:06 · 510 阅读 · 0 评论 -
左神算法笔记(七)——二叉树
先序中序后序二叉树遍历使用递归方法实现遍历,会发现代码非常的简单,这也可以看作是每种遍历方法的遍历整体的过程,其实完成的就是递归的操作,只是输出的时间不同。public static class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value...原创 2020-02-03 20:55:22 · 320 阅读 · 0 评论 -
左神算法笔记(六)——链表
回文链表创建一个栈,将链表中所有数据存入栈中,再将栈中数据与链表中的所有数据进行比较。利用单步指针和双步指针,当双步指针最后到链表尾的时候,将后半部分链表指向取反,再从链表头和链表尾同时开始对比数据大小,实现回文链表的判断。空间复杂度为O(1)。单向链表按照某值划分成左边小,中间相等,右边大的形式荷兰国旗问题,额外准备一个数组。荷兰国旗问题不具有稳定性。设置三个节点,分别为小于me...原创 2020-02-03 11:51:41 · 328 阅读 · 0 评论 -
左神算法笔记(五)——矩阵
设计整体宏观方法论下面几道题均涉及到一些具体的要求,如果按照内部具体的运动轨迹和变化则很难去看出真正的规律并且用代码实现,因此需要学会在宏观上设计,不拘泥于小节,利用整体的框架去思考。题目五:转圈打印矩阵转圈打印矩阵需要思考的是:左上角的坐标和右下角的坐标可以确定边框,从而可以让行不变列++,从而使得横框画出来,类似可以画出来整体。确定好边框之后画完再将横纵坐标减一,右下角的横纵坐标加一,从...原创 2020-02-02 20:33:29 · 188 阅读 · 0 评论 -
左神算法笔记(四)——队列和栈
题目一:用数组结构实现队列和栈难度相当于一面第一道题的难度队列结构:先入先出FIFO栈结构:先入后出实现栈:设置一个指针index,起始位置指向0的位置,读取一个数据则将数据放到数组【0】的位置,然后index++,之后新进来一个数则index++,取出数则index–。同时注意index的取值范围为0–size-1.用数组实现栈public static class ArraySta...原创 2020-02-02 19:23:06 · 238 阅读 · 0 评论 -
左神算法笔记(三)——桶排序及排序总结
排序稳定性排序稳定性在于对于相同的数值,能否将相同数据原本的顺序保证不交换。1(0)2(1)2(2)1(3)——>排序:1(0)1(3)2(1)2(2)针对于原始的信息排序,之前的顺序可能本身存在着一定的意义,排序稳定性会使得重新排序之后依旧维持着之前排序的特点。工程中的综合排序1.程序判断数组是否为基础类型,若为int,short,char,double,float基础类型,则会...原创 2020-02-01 22:00:23 · 723 阅读 · 0 评论 -
左神算法笔记(二)——快速排序,堆
快速排序荷兰国旗问题08荷兰国旗问题代码将小于大于区域进行划分,当数值小于则将数据放到左边,L+1,当数据大于则将数据放到右边R,同时将R-1.由于荷兰问题较为简单,因此在这里不再编写代码。改进后的快速排序public static void quickSort(int[] arr){ if(arr == null || arr.length<2){ return; }...原创 2020-02-01 19:38:52 · 1033 阅读 · 1 评论 -
左神算法笔记(一)时间复杂度
时间复杂度第一节讲解的是时间复杂度问题,所以在这里简单说明一下时间复杂度问题,时间复杂度为代码运行的基于单步时间的长度,时间复杂度在数学层面上为基于极限的一种思考,由于无法得知数据量本身的大小情况,因此算法运算的时间复杂度为当数据趋于无穷的时候需要花费的时间长度。在这里由于趋于无穷,因此将系数不再进行考虑,同时也只考虑最高次项,对其余次项进行忽略。冒泡排序:import java.util....原创 2020-02-01 15:48:46 · 417 阅读 · 0 评论