
算法
文章平均质量分 93
借汝之光,得以光明
不平凡的人生注定不平凡的路。
展开
-
从暴力破解到记忆搜索,再到动态规划,一个问题如何一步一步变成动态规划的
在这里就不得不吐槽一下学校的算法课,一上来就给我们讲动态规划什么最优子结构、套用一些公式,乱七八糟的也记不住。而实际上动态规划的发展是有一定历史的。为啥会有动态规划呢?起初算法大牛、先贤们在研究一类问题的时候,发现计算的过程中总是出现重复计算的数据,这一部分被反复计算了好多次,后来大神们就用map这样的额外容器记录之前出现的数据,得到了一部分的优化。再后来发现了这类问题的一个规律,最后得总结出了一个动态规划。实际上动态规划就是暴力破解的优化。学校的老师,讲算法直接就给了几个例题,然后讲,很无奈。原创 2020-06-16 21:22:21 · 628 阅读 · 1 评论 -
前缀树的数据结构以及O(n)解决子数组最大异或和的问题
什么是前缀树,比如你输入了一个字符串“abc”:那么前缀树如图所示:依次在头节点下创建节点,然后线上是字母(并非节点是)每个节点上面有两个值:path(代表有多少字符串经过了该节点)、end(有多少字符串以该节点结尾)。现在依次输入:“abc”、“bce”、“abd”、“bef”输入第二个字符串:输入第三个字符串:实际上输入abd的时候,之前已经输入abc了,可以复用之前的前缀ab。更新path。输入第四个字符串,符用b前缀:我们的头节点其实是没用的,字符串的原创 2020-06-15 22:21:42 · 629 阅读 · 0 评论 -
并查集数据结构以及多机器解决岛屿数量问题
并查集能够解决的问题:(1)查找两个元素是否处于同一个集合(2)把两个集合合并。并查集要求在建立并查集结构的时候,必须给出所有的并查集数据集,在之后的操作过程中不允许在动态添加数据。我们先来看一张小图:假设数据集如下:1,2,3,4,5,6如果合并1和2,同时合并3,4,结果如下:我们称1、3为代表节点,{1,2}、{3,4}、{5}、{6}是集合。现在合并{5}和{1,2},就变成:此时可以解决并查集的第二问题,查询4和1两个元素是否在同一个集合内,怎么做呢?就原创 2020-06-15 11:13:42 · 491 阅读 · 1 评论 -
内存替换算法:LRU和LFU超详细!!!
在我们内存或者cache中有两种替换算法来保证内存或者cache中都是“热点”的数据,一个是LRU和LFU。下面会先分析再给出代码!在这里的get和set操作的时间复杂度都是O(1),因为这两种速度都是很快的,不能要求O(n)。一、LRU首先我们搞一个双向链表。我们定义这个规则:如果有节点被访问(get或者set),那么直接放入到末尾,每一个队列都有一个capacity值表示容量,如果新元素加入,现在达到了容量值,就需要淘汰最近最少使用的,就是头节点。例如:现在node1被访问。原创 2020-06-14 13:04:30 · 3934 阅读 · 0 评论 -
满满的套路!!二叉树的动态规划
如果题目是一个二叉树的题,并且需要求解的答案(涉及到左右子树结果决策的)都可以用同一个模型来做。统一理解为以x为节点的树的......。下面几个题来讲解。一、判断一棵树是不是平衡树所谓平衡树就是:xoxoxxxooooxoo....自己去百度。那么我们就要求从树的叶子节点逐层向上计算出每一节点是否符合平衡树,如果有一个不符合那么就直接false。这里的可能性:(1)是(2)不是我们先来看节点,一个定义树的节点,另一个定义返回类型(isBalance:当前节点是否平衡,level:树的高度原创 2020-06-13 22:49:36 · 1827 阅读 · 0 评论 -
那些你不知道的avl树和红黑树的姿势!
一、二叉排序树什么是二叉排序树?对于任意一个节点,左子树的节点都比该节点大,右子树的节点都比该节点小,这就是平衡二叉树,这个和大顶堆有很大区别哦,别傻傻分不清。画图狂魔上线!就下面这玩意就叫做二叉排序树。二叉排序树、二叉查找树、二叉搜索树说的都是一个意思!!为啥要有这个东西?它能干啥?装x吗?原因是这个东西的查询效率特别高,他的时间复杂度是O(logn)。相比于你一个数组从头遍历还得时间复杂度O(n)呢,所以这个有点像二分法查找,但是二分法需要首先前提要求是数组必须有序。也就是说如果你输原创 2020-06-11 18:09:16 · 327 阅读 · 0 评论 -
神迹!开启遍历新时代 —— 神级遍历Morris算法,时间复杂度O(n),空间复杂度O(1)
一、递归方式和非递归方式遍历二叉树节点数据结构 public static class Node { public Integer value; public Node left; public Node right; public Node(Integer value){ this.value = value; } }递归的方式遍历二叉树算法。 public voi原创 2020-06-10 22:27:02 · 602 阅读 · 1 评论 -
单调栈结构以及算法中实际应用
一、什么是单调栈单调栈就是一个栈结构,但是要求栈底到栈顶的元素必须是单调的(递增或者递减)。本身没啥屌的,但是用法非常屌。二、看一个小题有这样一个数组[3,5,2,4,6,0,1,5],现在要求,打印出每一个元素距离它两边的最近的比它大的值。看图片:没有边界值的为null。暴力破解很容易,遍历每一个数组,然后两边查找比它大的值。有没有可能时间复杂度O(n)解法呢?单调栈上场:访问第一个元素,直接压栈访问第二个元素的时候发现5比栈中3大,由于单调性的问题,所以弹出3,此原创 2020-06-10 15:44:43 · 286 阅读 · 0 评论 -
实现栈和队列、用栈实现队列,用队列实现栈。
一、实现一个栈就是一个指针下标,入栈加,出栈减。 /** * 我的栈 */ public class MyStack{ private Integer[] arr; private Integer size; public MyStack(int initSize) throws IllegalAccessException { if(initSize < 0){原创 2020-06-09 22:42:33 · 155 阅读 · 0 评论 -
窗口内最大值或者最小值的更新结构(单调双向队列)
首先我们需要一个双向链表作为队列。例如一个数组{5,4,1,2,6},下面是下标;这个数组有两个指针,一个指向左边界,一个是指向右边界,这个范围就是窗口。并且left和right只能向右前进不能够后退。现有一个需求就是无论窗口是啥,你都要给我找到当前的最大值。也就是这个窗口的最大值。现在搞一个双向队列(值为下标数值):起初只有哦一个值,那么5就进入到队列,从后进入队列,right++,这时候遇到4,比5小那么也进入队列:right++,遇到1。也进入队列,这样如果想要获取窗口原创 2020-06-09 18:05:12 · 342 阅读 · 0 评论 -
BFPRT算法
一、先来看一个问题在一个乱序的数组中,寻找第k个小的值?很多人第一种解法,用大顶堆,然后poll第k个就是答案了,但是时间复杂度是O(nlogn),有没有O(n)的算法呢?答案是肯定的,就是我们的BFTRP算法二、铺垫这里我们需要大家知道荷兰国旗问题的解法,也就是选定一个基值,比它小的放在左边,比它大的放在右边,相等的放在中间,其实就是快速排序的partition过程。数组{5,7,12,4,2,7,2,5,6,0,1,2},假设选定基值是6,那么数组表示这样实际就是一个荷兰国旗,这原创 2020-06-09 12:59:51 · 895 阅读 · 0 评论 -
马拉车算法(manacher)求最长回文子串
关于回文字符串的概念大家可以大致去搜索一下,这里不赘述。一、解题思路当前字符串最长回文子串:思路实际上很简单,就是遍历每一个元素,然后分别以这个元素为中心,向两边扩展,比如说现在i = 4,那么当前字符串是t,我们可以里面写一个循环,l = i - 1,r = i + 1,然后判断chars[l] == chars[r]看是否相等,如果相等继续i--,r++,再新型比较,记录一下最大值即可。下面这种情况需要注意:当中心是连续的,那么最好的解决办法(不唯一)是如下:先将字符串变原创 2020-06-05 10:13:55 · 340 阅读 · 3 评论 -
kmp以及算法中如何使用kmp去解决问题
一、看一个问题两个字符串abcabcdeanc和abcd,我们判断后面的字符串是否时前面字符串的子串,如果是返回数组下标,否则返回-1。暴力解法 public static int matchStr(String s,String m){ if(s == null || m == null || s.length() < 1 || s.length() < m.length()){ return -1; }原创 2020-06-04 16:24:51 · 276 阅读 · 0 评论 -
每日算法:摆动序列、行相等的最少多米诺旋转、最小差值Ⅱ
一、摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)是正负交替出现的。相反, [1,4,7,2,5]和[1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(...原创 2020-06-03 12:36:02 · 206 阅读 · 0 评论 -
每日算法:朋友圈、岛屿数量、合法二叉树、后继者
1、朋友圈班上有N名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B的朋友,B 是 C的朋友,那么我们可以认为 A 也是 C的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个N * N的矩阵M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。输入: [[1,1,0], [1,1,0], [0,0,1]]输出: 2 说明:已知学生...原创 2020-05-20 20:41:53 · 434 阅读 · 0 评论 -
每日算法:矩阵篇(在行列都排好序的矩阵中找数、“之”字形打印矩阵、旋转正方形矩阵、转圈打印矩阵)
1、转圈打印矩阵【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 1415 16打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10,【要求】 额外空间复杂度为O(1)思路:我们定义两个点,一个是左上角a[a][b],一个是右下角a[c][d]。坐标就是(a,b)、(c,d)。我们可以打印最外层的数,依次然后a、b都加1,c、d减一,进入内圈。1 2 ...原创 2020-05-13 15:49:06 · 514 阅读 · 0 评论 -
每日算法:前一百道题(盛最多水的容器、三数之和、最接近三数之和、四数之和)
1、盛最多水的容器题目描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且n的值至少为 2。示例:输入:[1,8,6,2,5,4,8,3,7]...原创 2020-04-29 20:54:44 · 193 阅读 · 0 评论 -
每日算法:动态规划(解码方法、不同二叉搜索树、三角形最短路径之和、买股票的最佳时机)第二天打卡
题目一:解码方法一条包含字母A-Z的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例2:输入: "226"输出: 3解释: 它可以解码为...原创 2020-04-05 13:06:58 · 154 阅读 · 0 评论 -
每日算法:动态规划(不同路径、不同路径Ⅱ、最小路径和、爬楼梯)第一天打卡
题目一:不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例一:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -&...原创 2020-04-04 15:17:34 · 299 阅读 · 0 评论