![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法笔记
猪施主
电子科大研究僧
展开
-
算法笔记——左神进阶(例题)字符串加减乘除计算
字符串加减乘除计算经典例题,这题的3点说明是降低了一点难度,不然需要考虑有效性和溢出等状况。tips:在笔试面试时,关注容易出错的地方和边界条件,在刷题的过程中需要将特殊情况进行标记,多积累特殊的情况,面试官询问对于算法如何检查之类的可以先回答对数器,同时需要回答需要关注的特殊情况和边界条件。【题目】【思路】整个式子分为两种情况:没有括号:新建一个栈,将数字和符号都放到栈中,如果顶...原创 2020-03-16 21:39:59 · 1415 阅读 · 0 评论 -
算法笔记——左神进阶(4)平衡搜索二叉树、累加和为定值最长子数组
搜索二叉树搜索二叉树:对于搜索二叉树的任何一个节点,左子树的值都比节点小,右子树的值都比他大。TreeMap中,跟HashMap中一样可以提供key-value,同时会将key按照大小顺序排列。中间采用的就是搜索二叉树的知识。具备平衡性的搜索二叉树:AVL树——平衡性最严格任何一个节点的左子树和右子树高度差不大于1,复杂度还是O(logN)。导致调整非常频繁。红黑树——平衡性要求不严格...原创 2020-03-11 23:29:35 · 229 阅读 · 0 评论 -
算法笔记——左神进阶(3)Morris遍历:遇到二叉树遍历问题时,建议都采用
morris遍历解决问题:把二叉树遍历空间复杂度降为O(1)之前学习的二叉树遍历,不管何种方式,时间复杂度如何,空间复杂度都为O(h),h为二叉树的高度。morris算法将二叉树的空间复杂度变为O(1),同时时间复杂度不变,依旧保持O(n)。算法流程:现在的当前节点记为cur,如果cur无左孩子,则cur向右移动,cur=cur.right如果cur有左孩子,则找到左子树上最右的节点,...原创 2020-03-06 20:56:42 · 215 阅读 · 0 评论 -
算法笔记——左神进阶(3)单调栈结构:数组的最大数、最大子矩阵、数组烽火传递
单调栈结构的使用场景单调栈解决的问题是在一个数组中每一个数,要求左边离他近的比他大的和右边离他近的比他大的数思考的问题:如果知道所有数上得到上述要求,同时复杂度满足O(N)。暴力解的时间复杂度是O(N^2)单调栈结构:单调栈内,从栈底到栈顶满足从大到小。逐个入栈出栈: 复杂度为O(N)大的放下面,如果遇到一个数比栈顶的数大,则栈顶的数出栈,此时他的右边最近比他大的数就是让他出栈的数,...原创 2020-03-06 18:09:35 · 437 阅读 · 0 评论 -
算法笔记——左神进阶(2)BFPRT算法:TOP-K问题(查找第k小的数)+ 窗口内最大值的求解
TOP-K问题(查找第k小的数)+ 窗口一、BFPRT算法在一个数组中找出第k大的数1、暴力解法:先排序,再找2、快速排序:参考荷兰国旗问题,随机选数,分为左中右三个部分,然后按数量选择左边或右边区域,继续按荷兰国旗问题分三块,直到取到序号k在中间等于区域,则此时的中间数就是第k大的数。3、BFPRT算法:二、窗口题目1:窗口内最大值的求解题目2:最大值减去最小值小于或等于num的子数组数量一、...原创 2020-03-05 21:09:03 · 693 阅读 · 0 评论 -
算法笔记——左神进阶(1)Manacher算法:寻找字符串中最长的回文串
原始问题Manacher算法是由题目“求字符串中最长回文子串的长度”而来。比如abcdcb的最长回文子串为bcdcb,其长度为5。我们可以遍历字符串中的每个字符,当遍历到某个字符时就比较一下其左边相邻的字符和其右边相邻的字符是否相同,如果相同则继续比较其右边的右边和其左边的左边是否相同,如果相同则继续比较……,我们暂且称这个过程为向外“扩”。当“扩”不动时,经过的所有字符组成的子串就是以当前遍...原创 2020-03-05 15:41:36 · 456 阅读 · 0 评论 -
算法笔记——左神进阶(1)KMP算法:一种改进的字符串匹配算法
KMP算法:一种改进的字符串匹配算法解决原始问题:str1和str2为两个字符串,其中str1中的某个子串是否等于str2.Java中String的getIndexOf(str1,str2)方法就是str2是否包含在str1中,包含返回true,不包含返回false。中间其实就采用了KMP算法。暴力算法:将str1从最开始的位置开始配,如果第一个跟str2中的首位符合,则接着向下比,如果不符...原创 2020-03-05 14:55:23 · 475 阅读 · 1 评论 -
算法笔记——左神初级(10)暴力递归与动态规划、汉诺塔、数组累加和
sad原创 2020-03-04 22:46:30 · 680 阅读 · 1 评论 -
算法笔记——左神初级(9)前缀树结构介绍、字典序
...原创 2020-02-29 22:30:25 · 441 阅读 · 1 评论 -
算法笔记——左神初级(8)哈希表、布隆过滤器、一致性哈希、并查集、岛问题
题目1:认识哈希函数和哈希表哈希表中元素是由哈希函数确定的。将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。哈希函数经典的哈希函数的输入域是无穷大的,接受的参数可以是string类型,返回一个16位的16个值范围的数。哈希函数的输出域是有穷尽的,虽然很大,但是是个固定的数值当输入参数固定的情况下,得到的输出值是固定的,它不是随机函...原创 2020-02-29 16:38:19 · 626 阅读 · 0 评论 -
算法笔记——左神初级(7)二叉树遍历、直观打印二叉树、序列化、判断平衡、搜索、完全二叉树
题目1:二叉树的遍历先序、中序、后序先序:先打印当前节点,再打印整颗左子树,再打印整颗右子树中序:先左子树,当前节点,右子树后序:先做子树,右子树,当前节点下面是通过递归的方式遍历二叉树,代码层面的不同在于打印时机不同public static class Node { public int value; public Node left; public Node righ...原创 2020-02-28 23:04:38 · 353 阅读 · 0 评论 -
算法笔记——左神初级(6)判断链表回文、复制链表、链表相交或成环
链表注意:链表的题在笔试和面试过程中,考虑的重点不同。 链表问题的最优解往往都在额外空间复杂度上下功夫,时间复杂度一般都为O(N)。笔试中,以最快方式来做,使用辅助空间来做。面试中,主要是以减少辅助空间,维持时间复杂度为O(N)来思考题目10:打印两个有序链表的公共部分【题目】 给定两个有序链表的头指针head1和head2,打印两个 链表的公共部分思路:类似于merge归并排序,从...原创 2020-02-28 12:14:08 · 357 阅读 · 0 评论 -
算法笔记——左神初级(5)旋转矩阵、“之”字型打印矩阵
矩阵问题核心思路是考虑矩阵的特点,即一些边界点可以把一个矩阵确定下来。考虑代码流程的复用,以及考虑到边界条件。题目5:转圈打印矩阵【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10【要求】 额外空间...原创 2020-02-27 21:27:19 · 763 阅读 · 0 评论 -
算法笔记——左神初级(4)数组生成栈与队列结构、栈队列相互转换
固定数组生成栈栈:先入后出这里设置的是固定长度的栈,而不是变长的栈;除了准备size以外,还应有个index指示,该指示标志的是新来的数放置的位置。public class Code_01_Array_To_Stack_Queue { public static class ArrayStack { private Integer[] arr; private Integer ...原创 2020-02-27 19:03:16 · 223 阅读 · 0 评论 -
算法笔记——左神初级(3)排序稳定性、桶排序
排序的稳定性即在排序过程中,相同的值,它们的相对位置是否会被打乱。例如:具有排序稳定性:冒泡排序、插入排序、归并排序不具有排序稳定性:选择排序、快速排序、堆排序排序稳定性的价值:可以保留原始排序中的有用信息,例如几个人先按身高排序,然后再按年龄排序,第二次排完序后同年龄的人也是按身高排序的。工程中的综合排序方法如果数据很长:1.首先做判断,如果数据都是int、long、char、f...原创 2020-02-26 19:06:20 · 456 阅读 · 0 评论 -
算法笔记——左神初级(2)快速排序、堆排序
快速排序快速排序的核心思想是按基准值分区:荷兰国旗问题:public static int[] partition(int[] arr, int L, int R, int p) { int less = L - 1; int more = R + 1; while (L < more) { if (arr[L] < p) { swap(arr, ++...原创 2020-02-26 15:12:37 · 912 阅读 · 1 评论