![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
左程云算法学习
文章平均质量分 68
学而知不足~
这个作者很懒,什么都没留下…
展开
-
左神算法笔记10:树形dp、Morris遍历
树形dp套路使用前提:如果题目求解目标是S规则,则求解流程可以定成以每个节点为头结点的子树在S规则下的每一个答案,并且最终答案一定在其中套路讲解树形dp套路第一步:以某个节点x为头结点的子树中,分析答案有哪些可能性,并且这种分析是以x的左子树,x的右子树和x整棵树的角度来考虑可能性树形dp套路第二步:根据第一步的可能性分析,列出所需要的信息树形dp套路第三步:合并第二步的信息,对左树和右树提出同样的要求,并写出信息结构树形dp套路第四步:设计递归函数,递归函数是处理以x为头结点的情况下原创 2021-12-12 12:18:49 · 658 阅读 · 0 评论 -
左神算法笔记09:Manacher算法、窗口最大值更新结构、单调栈
Manacher算法解决的问题:字符串str中,最长回文子串的长度如何求解如何做到时间复杂度O(N)完成伪代码时间复杂度分析代码实现public class Manacher { public static char[] manacherString(String s) { char[] charArr = s.toCharArray(); char[] res = new char[s.length() * 2 + 1]; in原创 2021-12-09 12:22:40 · 1053 阅读 · 0 评论 -
左神算法笔记08:并查集、KMP
岛问题一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵上有多少个岛举例:001010111010100100000000这个矩阵有3个岛进阶:如何设计一个并行算法解决这个问题public static int countIslands(int[][] m) { if (m == null || m[0] == null) { return 0; } int N = m.length; int原创 2021-12-07 22:52:36 · 527 阅读 · 0 评论 -
左神算法笔记07:哈希函数与哈希表
哈希函数输入域无穷输出域S有限,比如MD5的返回值是0~2的64次方-1相同的输入,一定返回相同的输出(不随机)不同的输入,可能有相同的输出(哈希碰撞),但是概率非常低每一个输出都均匀离散设计RandomPool结构设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入delete(key):将原来在结构中的某个key移除getRandom():等概率返回结构中的任何一个key要求:时间复杂度都是O(1)思路:设计两个hash原创 2021-11-29 18:53:10 · 180 阅读 · 0 评论 -
左神算法笔记06:暴力递归
暴力递归暴力递归就是尝试把问题转化为规模缩小了的同类问题的子问题有明确的不需要继续进行递归的条件(base case)有当得到了子问题的结果之后的决策过程不记录每一个子问题的解一定要学会怎么去尝试,因为这是动态规划的基础汉诺塔问题打印n层汉诺塔从最左边移动到最右边的全部过程public class Hanoi { public static void hanoi(int n){ if(n > 0){ func(n,"左","右","中"); } } //1原创 2021-11-21 01:36:35 · 1055 阅读 · 0 评论 -
左神算法笔记05:前缀树、贪心算法、N皇后问题
前缀树何为前缀树?如何生成前缀树?例子:一个字符串类型的数组arr1,另一个字符串类型的数组arr2。arr2中有哪些字符,是arr1中出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印arr2中出现次数最大的前缀。public class TrieTree { public static class TrieNode{ //表示添加前缀树的时候,当前节点到达过多少次原创 2021-11-20 19:20:24 · 1812 阅读 · 0 评论 -
左神算法笔记04:图
图的存储方式邻接表邻接矩阵如何表达图?生成图?技巧:用自己喜欢的结构实现所有图的算法,然后笔试遇到不一样的图结构,将其转化为自己喜欢的结构,再调用接口Graph类public class Graph{ public HashMap<Integer,Node> nodes; public HashSet<Edge> edges; public Graph(){ nodes = new HashMap<>(); edges = new Has原创 2021-11-18 21:03:15 · 314 阅读 · 0 评论 -
左神算法笔记03:二叉树
二叉树节点结构:class Node{ V value; Node left; Node right;}用递归和非递归两种方式实现二叉树的前序、中序、后序遍历如何直观的打印一颗二叉树如何完成二叉树的宽度优先遍历(常见题目:求一颗二叉树的宽度)用递归和非递归两种方式实现二叉树的前序、中序、后序遍历递归方式太简单了,无需赘述非递归方式前序遍历:从栈中弹出一个节点cur处理cur先把cur的右孩子节点压入栈,再将cur的左孩子节点压入栈周而复始中序遍历:定义一个栈当原创 2021-11-17 23:45:17 · 510 阅读 · 0 评论 -
左神算法笔记02:哈希表、有序表、链表
哈希表基本概念不做阐述增删改查的时间复杂度都是常数级别(但是比较大的常数)java中,如果哈希表的key是基本数据类型,哈希表内部按真实值传递java中,如果哈希表的key不是基本数据类型,哈希表内部按地址值传递(8字节)有序表有序表在使用层面上可以理解为一种集合结构如果只有key,没有伴随数据value,可以使用TreeSet结构如果既有key,又有伴随数据value,可以使用TreeMap结构有无伴随数据,是TreeSet和TreeMap唯一的区别,底层实现是一回事有序表和哈希原创 2021-11-15 20:22:02 · 436 阅读 · 0 评论 -
左神算法笔记01——排序算法
十大排序算法选择排序遍历n次,每次找出i到n-1最小的值,和i位置的值做交换时间复杂度为o(n²) public static void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void selectionSort(int[] arr){ if(arr == null |原创 2021-11-10 21:58:23 · 812 阅读 · 0 评论