![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 54
李先森LeeCode
这个作者很懒,什么都没留下…
展开
-
数据结构:自己实现一个LRU的缓存(初始化传入缓存最大容量)
最近爱上了刷力扣,越刷越上瘾!然后今天有道题是让自己实现一个LRUCache,也就是LRU缓存。LRU缓存呢,就是当容量不够的时候就要淘汰掉最近最少使用的缓存值,也就是Least Recently Used,这也就是LRU缓存名字的由来。我在力扣上面提交的题也不少了,这道题还是比较有意思的(这道题的力扣网址),我也是直接借用了JDK的LinkedHashMap来实现的,这里直接上代码:import java.util.LinkedHashMap;import java.util.Map;/**原创 2021-07-07 23:12:51 · 449 阅读 · 2 评论 -
算法:计算股票的最大收益(动态规划经典案例)
有一道算法题,很有意思:给你一个数组,代表每天股票的买/卖价序列,要求在序列期间内最多只允许买、卖各一次(先买后卖,买要在卖之前),求此期间内的最大收益是多少(可以选择不卖,即收益为0)。举例如下:价格序列为[7,1,5,3],则代表第一天股票价格为7,第二天为1,第三天为5,第四天为3(数组长度不定),此时第二天价格为1的时候买入,第三天价格为5的时候卖出,则赚取最大的收益4。如果到了第四天再卖,则只能收益2了。你也不能第一天卖,第二天买,虽然收益是6,但是没有买就卖不出去,只能先买后卖,所以这样是犯原创 2021-04-09 22:35:49 · 4110 阅读 · 0 评论 -
算法:用Java实现用KMP算法来进行字符串的匹配
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与内容串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next[]数组来实现,next[]数组本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。下面是我用Java实现的KMP字符串匹配算法:KMP.java类原创 2020-05-12 17:13:14 · 500 阅读 · 1 评论 -
算法:用Java实现双轴快速排序(DualPivotQuickSort)
本文是用Java实现双轴快速排序,我找不到参考的文章地址了,十分抱歉,在此感谢参考文章的原作者,是你给了我思路和灵感!双轴快速排序和普通的快速排序不同的地方在于,普通的快速排序选出一个数字,作为一个基准值,然后通过数组值交换的方式,让左边区域的数字都小于基准值,右边区域的数字都大于基准值,然后再对左右两边的区域进行递归快速排序,直到数组全部有序。而双轴快速排序则是选出两个基准值a和b,且a不大于...原创 2020-03-27 10:19:46 · 939 阅读 · 3 评论 -
算法:用Java实现跳表(SkipList),让查找的时间复杂度媲美红黑树
今天略微有些晚了,我就暂时不讲解什么是跳表了,先上我实现跳表的Java代码以及测试结果,空了再补上我自己用Java实现的跳表类:SkipList.javaimport java.util.ArrayList;import java.util.List;/** * @Author: LiYang * @Date: 2020/3/6 23:57 * @Description: 跳表的实...原创 2020-03-07 00:29:41 · 437 阅读 · 0 评论 -
算法:用Java实现有序trie树,并用于实现单词字典排序的功能
上一遍博客,我已经给大家介绍过trie树。trie树算是一种前缀树,用来储存单词再合适不过了,而且很多单词都有相同的前缀,如果用这个树来存单词,那是相当省空间的。今天我要实现的这个有序trie树,和上一篇博客的trie树的最大不同,就是今天的有序trie树,字母的下级结点集合是用的TreeSet实现的。这就使得每个字母结点的下级结点都是按照字典序列来排布的。这样设计有什么好处呢?如果我们仿照二叉...原创 2020-02-27 23:55:24 · 2581 阅读 · 0 评论 -
算法:用Java实现trie树,并用于实现敏感词过滤的功能
trie树,可能大家都比较陌生。trie树,又叫字典树,是一种树形结构,一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。trie树有3个基本性质: 1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 3. 每个节点的所有子节点包含的字符都不相同原创 2020-02-20 19:54:16 · 1032 阅读 · 3 评论 -
算法:用Java递归回溯求解八皇后问题的所有解(共92种解)
八皇后问题,就是国际象棋上面的皇后,可以横竖斜地走,很威风。国际象棋棋盘是8*8的,上面需要放8个皇后,这8个皇后无论横纵斜,都无法攻击到其他的皇后,这样就是一个八皇后问题的解。今天我们就用Java来实现八皇后问题的所有解:import java.util.HashSet;import java.util.Set;/** * @author LiYang * @ClassName Ei...原创 2019-12-26 14:43:31 · 873 阅读 · 0 评论 -
算法:根据输入的字符串,生成其全排列字符串集合
最近遇到一个很有意思的问题,那就是生成指定字符串的全排列集合。什么意思呢,我举两个例子你就明白了: 1. 字符串 "ABC" 的全排列集合:ABC, ACB, BAC, BCA, CAB, CBA 2. 字符串 "ABB" 的全排列集合:ABB, BAB, BBA相信你已经看明白了,就是组成字符串的所有字符重新打乱顺序,然后生成其所有排列形式的新字符串的集合。如果字符串里面有重复的字符,则结果集合需要去重。这个算法我还是打算用递归来实现,不得不说递归真的是太好用了!下面是实现这个算法的源码:原创 2019-12-25 13:33:21 · 501 阅读 · 0 评论 -
算法:浅谈算法思想中的动态规划(Dynamic Programming),并附六个动态规划算法题的详细解法
动态规划(Dymamic Programming),简称DP,是算法设计技巧的一种(还有贪婪算法、分治算法、回溯算法、随机化算法等)。其主要思想,就是通过把原问题分解为相对简单的子问题的方式求解复杂问题的算法思想,当然,动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。动态规划的使用规则:最优化原...原创 2019-12-11 13:51:14 · 254 阅读 · 0 评论 -
算法:用Java实现 AVL 二叉平衡搜索树(Adelson-Velskii & Landis Tree)
今天我用Java给出一种经本人测试通过的、附测试用例的、可以直接使用的AVL树的实现。AVL树的概念,在CSDN上面随便都可以搜得到,这里就不再赘述了,就直接给大家附上AVL树的Java实现源码,你复制源码后,可以直接在你的IDE里面运行、测试和使用。我的Java实现参考了《数据结构与算法分析 Java语言描述 第三版》一书,具体是该书86-94页的相关内容,并在其实现上做了一些补充和优化,最后封装为AVLTree类,可以调用insert()、remove()、find()等方法来操作AVL树。顺便说一下,原创 2019-12-09 16:37:31 · 214 阅读 · 0 评论 -
算法:根据四色定理(Four color theorem),求出地图的所有着色方案
地图着色,需要每一个区域都使用一种颜色来进行填充,然后为了与相邻接壤的区域分开,就要求两个接壤的区域需要使用不同的颜色。四色定理的意思是,最多只需要四种颜色,就可以为所有的地图进行全部区域着色,且任意两个接壤的区域都是不同的颜色。在四色定理的指导下,我用Java来实现求解任意一副地图的所有可行的区域着色方案的算法,并求解下面这幅示例地图的所有着色方案:算法思路:将所有的区域进行编号,从0开...原创 2019-12-08 02:34:37 · 8542 阅读 · 0 评论 -
算法:用Java实现一个带删除功能的布隆过滤器(BloomFilter)
上一篇博客,我实现了一个迷你的布隆过滤器(BloomFilter)。今天我再实现一个带删除功能的布隆过滤器增强版布隆过滤器删除功能的原理,就是原来是通过true和false来判断,而现在是通过计数来判断了。add()操作就是往那些哈希值上面+1,删除就是对应的哈希值-1。当然删除之前需要判断,如果有的哈希值都是0了,肯定就不让删了。和exists()操作一样,删除功能也有可能失效,就是删除了之后...原创 2019-12-02 18:49:14 · 2591 阅读 · 0 评论 -
算法:用Java实现一个mini布隆过滤器(BloomFilter)
实际上,布隆过滤器是一种数据结构(我的博客以"算法"开头的,都是指数据结构与算法)。布隆过滤器(BloomFilter)是一种比较巧妙的概率型数据结构,可以比较高效地进行插入和查询(本博客的实现暂不包含删除)操作。比如插入一些字符串后,可以查询某个字符串一定不存在,或者可能存在。一般用于URL查重、邮箱黑名单过滤等操作。本博客我打算实现的布隆过滤器的操作,有add()和exists()操作两种:...原创 2019-12-02 16:35:28 · 262 阅读 · 0 评论 -
算法:用不相交集类(并查集)实现随机迷宫生成算法,并最终得到能显示迷宫图的HTML文件
之前我用不相交集类(并查集)辅助实现了克鲁斯卡尔(Kruskal)算法求出图的最小生成树,今天我就用并查集来再实现一个其经典的应用:随机迷宫图的生成并查集生成迷宫图的原理如下,也是迷宫图算法实现的思路:根据自定义迷宫的宽高,有一系列 宽×高 的矩阵点,从0开始编号刚开始这些矩阵点都是不连通的,对应并查集也是都不相交我们随机找到两个相邻的矩阵点,然后通过并查集的union算法,查看相邻矩阵...原创 2019-11-29 23:24:55 · 469 阅读 · 0 评论 -
算法:用Java实现图论算法中欧拉回路的求解(一笔画问题),并求出 "奥运五环" 的所有一笔画画法
今天我准备用Java来求解图论算法中的欧拉回路(EulerCircuit)问题,这个名字可能对大家有些陌生,如果我说一笔画,大家肯定就都清楚了。原来有一个"七桥问题",不知道的可以百度,这里就不详述。继而引出了一笔画的问题。后来欧拉大神就提出了一笔画的一个原则,那就是一个图形如果可以一笔画,那么把它抽象为图的话,度为奇数的顶点只能是0个或两个。意思也就是,可以一笔画的图形,顶点要么全部都是度为偶数的,要么有且仅有两个度为奇数的顶点,而且一笔画路径的开始和结束,都得是这两个度为奇数的顶点。然后一笔画问题就又叫原创 2019-11-21 14:17:08 · 4010 阅读 · 0 评论 -
算法:用Java尝试解决图论算法中的网络流问题,以求得最大流
这篇博文,我尝试用Java解决图论算法中的网络流问题,以求得最大流的流量和与其对应的所有增广路径组合原创 2019-11-19 11:18:17 · 553 阅读 · 0 评论 -
算法:用Java实现图论算法中的拓扑排序,并应用拓扑排序安排课程表
本文我打算用Java实现图论算法中的拓扑排序,并应用拓扑排序安排课程表。课程表就是很常规的那种Java学习的简单路线图,首先下图就是Java课程学习的一个拓扑顺序图:上面这张图是什么意思呢?黑色的字就代表要学习的课程,而红色的箭头就代表课程学习的拓扑顺序,课程之间是有依赖的,箭头代表课程学习顺序: 1. 最左边的Java、SQL、HTML、CSS这类课程则不需要提前学习任何课程,即可开始学习 2. 想学习Servlet课程,你就需要先学习Java课程,然后才能学习Servlet课程 3. 想学习J原创 2019-11-18 17:03:08 · 2591 阅读 · 0 评论 -
算法:以不相交集类(DisjointSet)作为辅助工具类,用Java实现克鲁斯卡尔(Kruskal)算法求出图的最小生成树
之前我用克鲁斯卡尔(Kruskal)算法求出了图的最小生成树(还记得是如何求出最小生成树的吗?就是把图的所有边拿出来,按权重从小到大排列,然后先拿最小的边放到图中。如果不形成环,则继续拿剩下的最小权重的边,直到图中所有点连通,共需要图顶点数-1条边),因为当时还不知道不相交集类这么个数据结构与算法,所以在判断一条边是接受还是舍弃的时候,用的邻接矩阵的的广度优先遍历算法(BFS)来判断两个顶点是否是...原创 2019-11-18 15:59:00 · 263 阅读 · 0 评论 -
算法:用Java实现不相交集类(DisjointSet),也叫并查集
本文我用Java实现不相交集类(DisjointSet)的数据结构与算法。在这里先解释一下不相交集类,你可以想象成为刚开始有N个独立的元素,N个元素两两都不等价(不属于一个同等价集合,刚开始有N个等价集合,每个等价集合都只有一个元素,且这个元素就是等价集合的根元素,可以理解为等价集合的代表)。然后可以通过合并操作,把两个元素变为等价,随着后面合并操作的量越来越大,两个元素的合并就等于这两个元素所代表的两个等价集合的合并,最后合并成一个最大的等价集合。除了合并操作,还有寻找操作,就是寻找一个元素所在的等价集合原创 2019-11-12 11:38:19 · 561 阅读 · 0 评论 -
算法:用Java实现在海量的数据中,找到最大的N个数字,也就是TopN问题
我准备用优先队列来实现TopN问题,海量数据是指计算机内存装不下的很大的数据文件,在里面找到最大的N个数字。因为是海量的数据文件,所以还是按照以前外部排序那种,每次读文件的一部分,然后一个一个地吐数字,以确保内存可以处理。然后在读文件吐出的一个个数字中,找到最大的N个数字原创 2019-11-12 11:35:53 · 1598 阅读 · 0 评论 -
算法:用Java实现外部排序(ExternalSort)
外部排序,是相对于内部排序而言的。之前我分享了很多种排序,这些排序都是将待排序的乱序数组全部放到内存里面,然后执行相应的排序算法,完成排序并输出结果的。整个排序的过程都是在内存里一次性加载所有的待排序数字,然后在内存里完成排序算法,这种叫内部排序。外部排序,就是需要排序的数字太多了,以至于内存一次加载不了所有的数字,然后就只能通过今天分享的外部排序来完成原创 2019-11-12 11:32:12 · 2078 阅读 · 1 评论 -
算法:用Java实现睡眠排序(SleepSort)
本文我准备用Java实现睡眠排序。睡眠排序由于其独有的排序方式,排序数字最好是非负整数,且最大值不要太大,否则算法会运行很久……非负小数其实也可以,但是排序后的相邻小数的差值不要太小,否则可能会出错,因为多线程的运行有其不确定性和延迟的可能……虽然睡眠排序挺欢乐的,但是想写好一个睡眠排序也挺不容易的,涉及到多线程的设计、启动、运行,以及控制的方法,可以算是多线程编程的一次小小实战!本次睡眠排序,...原创 2019-11-11 17:23:39 · 1050 阅读 · 0 评论 -
算法:用Java实现基数排序(RadixSort)
本文我准备用Java实现基数排序。基数排序由于其独有的排序方式,只适合待排序的数字都是非负整数的情况。基数排序和计数排序名字很相像,不要搞混淆了。接下来我列举一下二者的共同点和不同点不过他们有共同点:计数排序和基数排序的共同点:1、都是只适合对非负整数的排序2、都是线性的时间复杂度计数排序和基数排序的区别:1、计数排序不能接受有很大值的待排序元素;而基数排序可以接受2、计数排序实现和操...原创 2019-11-06 15:35:07 · 291 阅读 · 0 评论 -
算法:用Java实现计数排序(CountSort)
本文我准备用Java实现计数排序(计数排序由于其独有的排序方式,只适合待排序的数字都是非负整数的情况)。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程:import java.util.Arrays;import java.util.Random;/** * @author LiYang * @ClassName CountSort ...原创 2019-11-05 20:30:20 · 681 阅读 · 0 评论 -
算法:用Java实现堆排序(HeapSort)
本文我准备用Java实现堆排序。其实我以前在用二叉大顶堆实现优先队列的时候,就已经顺便实现了堆排序,今天把其中堆排序的代码提取出来,专门作为排序的一篇博文,并附上以前用二叉大顶堆实现的优先队列,以及顺便实现堆排序的博文地址:点我查看。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程:import java.util.ArrayList;impor...原创 2019-11-05 16:37:21 · 247 阅读 · 0 评论 -
算法:用Java实现希尔排序(ShellSort)
本文我准备用Java实现希尔排序。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程(算法参考:https://baike.baidu.com/item/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F):import java.util.Arrays;import java.util.Random;/** * @au...原创 2019-11-05 16:04:18 · 191 阅读 · 0 评论 -
算法:用Java实现归并排序(MergeSort)
本文我准备用Java实现归并排序。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程:import java.util.Arrays;import java.util.Random;/** * @author LiYang * @ClassName MergeSort * @Description 归并排序算法 * @date 2019...原创 2019-11-04 17:32:51 · 536 阅读 · 1 评论 -
算法:用Java实现快速排序(QuickSort)
本文我准备用Java实现快速排序。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程:import java.util.Arrays;import java.util.Random;/** * @author LiYang * @ClassName QuickSort * @Description 快速排序算法 * @date 2019...原创 2019-11-04 16:36:36 · 232 阅读 · 0 评论 -
算法:用Java实现冒泡排序(BubbleSort)、插入排序(InsertSort)、选择排序(SelectSort)
接下来我准备发表一系列关于排序的算法,本文我准备用Java实现冒泡排序、插入排序、选择排序:1、冒泡排序:import java.util.Arrays;/** * @author LiYang * @ClassName BubbleSort * @Description 冒泡排序算法 * @date 2019/11/4 11:14 */public class BubbleS...原创 2019-11-04 16:23:30 · 229 阅读 · 0 评论 -
算法:根据二叉树的数据及其对应的顺序存储下标值(从1开始),生成对应的二叉树
之前我实现了通过二叉树的中序遍历顺序,加上前后序任意一种遍历顺序,最后在内存中生成二叉树的方法(点我去看看)。今天我再实现一种根据二叉树的数据及其对应的顺序存储下标值(从1开始),在内存中生成对应的二叉树我们还是拿之前文章的二叉树来作为例子。二叉树有一种方式叫做顺序存储,就是把二叉树先填满为完全二叉树(没有的节点作为虚节点,仅作为数位置),然后先将根节点放入数组第一个位置,然后第二层,也就是根节...原创 2019-11-04 16:05:19 · 2628 阅读 · 0 评论 -
算法:用Java求解约瑟夫环(Joseph Circle)的问题
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因...原创 2019-11-04 09:32:01 · 333 阅读 · 0 评论 -
算法:根据二叉树的中序遍历以及前/后序遍历,求出后/前序遍历(中间包含二叉树的生成算法)
经常我们会看到这样的问题,那就是给出二叉树的前序遍历和中序遍历,求后序遍历。或者给出二叉树的后序遍历和中序遍历,求前序遍历。正所谓是难者不会,会者不难,今天我就实现这个算法,并分享给大家二叉树的三种遍历,知道其中两个,便可得到剩下的一个。中序遍历是必须知道的,然后前后序再知道一个,其实就可以得到这个二叉树了。得到了二叉树,也就得到了三种遍历顺序了所以,我的算法思路也就如下:1、先根据两种已知...原创 2019-10-27 14:38:57 · 971 阅读 · 0 评论 -
算法:通过克鲁斯卡尔(Kruskal)算法,求出图的最小生成树
之前我给大家分享过用普利姆(Prim)算法来求出图的最小生成树(点我去看看),今天我再给大家分享一个也是求图的最小生成树的克鲁斯卡尔(Kruskal)算法这两个算法都是求图的最小生成树,有什么区别呢:1、Prim算法是通过一个点来进行动态扩张,Kruskal是从零开始逐渐加入最小权的边2、Prim算法是动态规划算法,Kruskal是将所有的边都遍历一遍,看哪些是组成最小生成树的边接下来我们...原创 2019-10-27 00:34:13 · 8677 阅读 · 0 评论 -
算法:通过弗洛伊德(Floyd)算法,求出图中任意两个顶点的最短路径
之前我给大家分享过用迪杰斯特拉(Dijkstra)算法求图的最短路径,今天我再给大家分享一个也是求图的最短路径的弗洛伊德(Floyd)算法这两个算法都是求图的最短路径,有什么区别呢?1、Dijkstra算法是求图中一个点到其他所有点的最短路径,Floyd算法是求图中任意两个顶点之间的最短路径2、Dijkstra算法是通过贪婪算法来实现的,Floyd是通过动态规划算法实现的3、Dijkstr...原创 2019-10-25 15:32:46 · 3390 阅读 · 0 评论 -
算法: 求一个整数的质因数(分解质因数)
public class PrimeFactorization { public static void primeFactorization(int num){ if(num < 2){ throw new IllegalArgumentException("入参请用大于等于2的整数!"); } int m...原创 2018-10-09 17:22:57 · 2118 阅读 · 0 评论 -
算法:N级台阶,一步可走1或2阶,求全部的路线方案
问题描述:上楼梯,楼梯有N级台阶,可以一步走一级台阶,也可以一步走两级台阶,请问一共有多少种走法?这些走法分别是什么?程序需要入参总台阶数totalStep,比如totalStep=3的时候,控制台输出如下结果:第1种方案:1 -> 1 -> 1第2种方案:1 -> 2第3种方案:2 -> 1totalStep=6的时候,控制台输出:第1种方案:1 ->...原创 2019-07-14 21:11:53 · 1464 阅读 · 0 评论 -
算法:将IPv4的IP地址,与对应的int码互转,数据库就存int,代替IP的varchar
我们在日常的业务中,有的时候需要存IP地址,一般我们都会在数据库中用varchar来存储IP地址。但是存IP地址用varchar的话,是开销比较大的,如果数据量上来了,那需要的存储空间也就比较大了。此外如果我们想要查找某个IP是否的话,字符串比较也是从左到右逐个比较,开销也是比较大的下面我写了一个转换方法,这个方法可以将一个IP地址转化为int值,然后通过这个int值也可以还原为原来的IP地址。...原创 2019-08-17 20:03:48 · 295 阅读 · 0 评论 -
算法:图的 "深度优先搜索" 和 "广度优先搜索" 的Java简单实现
算法一般跟数据结构是联系在一起的,数据关系一般有一对一、一对多、多对多。其中,一对一可以理解为线性表,如数组和链表这些;一对多可以理解为树,比如二叉树,一个根节点对两个子节点;多对多则可以理解为图,比如接下来提供的范例:上面就是图(graph)的一个示例,A对应C和D,而D对应A和C,C就更多了,对应ADBF……上面的示例图,每个带数据的英文字符和圈圈,叫图的顶点(Vertex),顶点间由线...原创 2019-09-01 15:01:46 · 247 阅读 · 0 评论 -
算法:微信拼手气红包的红包金额分配算法的Java实现
微信拼手气红包,大家都体验过吧,多的就不说了,直接上代码:import java.util.*;/** * 微信红包金额分配 * @Author: LiYang * @Date: 2019/9/7 13:33 */public class RedPacketPuzzle { /** * 微信拼手气红包金额分配方案(输出结果为分,一分钱的分) * @pa...原创 2019-09-07 14:19:53 · 2911 阅读 · 1 评论