算法
saber@p
星辰滚烫不如麻辣烫
展开
-
关于限流算法
最近在项目中遇到了限流算法、于是自己把 常见的限流算法给研究了一下原创 2021-07-20 20:52:51 · 202 阅读 · 0 评论 -
拓扑排序之再温习
最近回去做 以前做过的leetcode题目,发现对拓扑排序的定义 有了误解,以为是要按照分层收集才算拓扑排序,其实不是的https://leetcode-cn.com/problems/course-schedule-ii/solution/ke-cheng-biao-ii-by-leetcode-solution/拓扑排序存在于有向图中,只要按照有向边的方向 收集节点 不会出现整体顺序和有向边相反 即可比如下图的案例收集有向图的拓扑 不需要按照层次分层比如深度搜索获取的结果 可能是 A B原创 2021-06-19 21:24:28 · 80 阅读 · 0 评论 -
整数溢出处理操作
在算法题 有时候给你限制操作数字的范围 [min,max]那么可以采用INT_MIN 和 INT_MAX的逆操作去做判断 /** * 判断res * 10 是否会溢出(不在[min,max]范围内) * 这里默认INT_MIN 和 INT_MAX 采用的进制是10 * @param rev * @param INT_MIN * @param INT_MAX * @return */ public boolean o原创 2021-05-18 10:13:21 · 429 阅读 · 0 评论 -
Deque双端队列
最近在使用单调栈解决leedcode一些算法题的时候,发现自己对deque 使用有些不规范原创 2021-04-17 16:45:19 · 203 阅读 · 0 评论 -
动态规划 - 入门
什么是动态规划根据维基百科的解释将复杂的问题拆分成若干个简单的子问题每个子问题仅仅解决一次,并保存他们的解最后推导出原问题的解能够采用动态规划来解决的问题,通常具备两个特点最优子结构(最优化原理): 通过求解子问题的最优解,可以获得原问题的最优解无后效性某个状态一旦确定,则此后的演变过程不再受此前各状态的影响...原创 2021-03-05 19:50:10 · 124 阅读 · 2 评论 -
图的进阶
有向图定义 : 有向图是一副有方向性的图,是由一组顶点 和 有方向性的边 组成的出度 : 由某个顶点 指出 的边的个数入度 : 指向某个顶点的边的个数有向路径 : 由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点有向环 : 一条至少含有一条边,且起点和终点相同的有向路径有向图的Api 的设计import java.util.LinkedList;import java.util.Queue;/** * 有向图 */public class Di原创 2021-02-17 22:04:42 · 137 阅读 · 0 评论 -
图 的入门介绍
图的定义和应用图的定义图是由一组顶点 和 能够将两个顶点相连的边组成的图的应用地图无向图图的术语要表示一幅图,需要表示清楚部分内容图中所有的顶点所有顶点的边下面是实现一个 无加权 无向图的Apiimport java.util.LinkedList;import java.util.Queue;/** * 无加权 无向图 */public class Graph { /** * 图中 顶点数 */ privat原创 2021-02-17 17:59:22 · 66 阅读 · 0 评论 -
关于并查集
什么是并查集 ?并查集是一种树形的数据结构并查集可以高效的进行两种操作查询元素p 和 q 是否属于同一组合并元素p 和 q 所在的组下面手动实现一个并查集案例/** * 并查集的实现案例 */public class UF_Tree { /** * 记录并查集 中的分组数量 */ private int count; /** * 采用一个数组 数组下标表示元素 * 数组的值表示 所在的树 (用根节点表示) */原创 2021-02-16 20:18:22 · 89 阅读 · 0 评论 -
回溯算法(理论)
什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯。回溯是递归的副产品,只要有递归就会有回溯。「所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数」。回溯法的效率回溯法的性能如何呢,这里要和大家说清楚了,「虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法」。「因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案」,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯原创 2020-12-16 10:01:36 · 481 阅读 · 0 评论 -
快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:**通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。**排序原理(1)首先设定一个分界值,通过该分界值将数组分成左右两部分;(2)将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;(3)然后,左边原创 2020-10-18 15:34:01 · 163 阅读 · 0 评论 -
归并排序
思想(1)尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。(2)将相邻的两个子组进行合并成一个有序的大组;(3)不断的重复步骤2,直到最终只有一个组为止。API设计归并的原理定义一个辅助数组 和两个辅助指针代码实现import org.junit.Test;import java.util.Arrays;/** * 归并排序 */public class Merge { /** * 完成归原创 2020-10-18 11:55:48 · 2811 阅读 · 0 评论 -
希尔排序
思想 (1)选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组; (2)**对分好组的每一组数据完成插入排序**; (3)减小增长量,最小减为1,重复第二步操作。增长量h的确定:增长量h的值每一固定的规则,我们这里采用以下规则: //确定增长量的最大值 int N=a.length; int h=1; while (h<N/2){ h=h*2+1; }API设计代码原创 2020-10-18 10:57:45 · 192 阅读 · 1 评论 -
插入排序
思想(1)把所有的元素分为两组,已经排序的和未排序的;(2)找到未排序的组中的第一个元素,向已经排序的组中进行插入;(3)倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;API设计代码实现import org.junit.Test;import java.util.Arrays;/** * 插入排序 */public class Insertion { /** *原创 2020-10-18 10:29:50 · 104 阅读 · 0 评论 -
选择排序法
思想(1)每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引(2)交换第一个索引处和最小值所在的索引处的值API设计代码实现/** * 选择排序 */public class Selection { /** * 对数组内的元素进行排序 * */ public static void sort(Compar原创 2020-10-18 10:08:56 · 268 阅读 · 0 评论 -
冒泡排序法
思想(1)比较相邻的元素,如果前面的比后面的大,就交换元素索引位置(2)对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。## API的设计代码实现/** * 冒泡排序算法实现 */public class Buddle { /** * 对数组内的元素进行排序 * @param a */ public static void sort(Comparable[] a){ for原创 2020-10-18 09:32:53 · 230 阅读 · 3 评论