![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 53
NinoSun
这个作者很懒,什么都没留下…
展开
-
判断图是否有环——附带Leetcode 课程表的Java解
判断图是否有环附带Leetcode 课程表的Java解拓扑排序无向图求出图中所有顶点的度把图中所有度 <=1 的顶点放入队列Q中依次抛出队列Q中的顶点,将抛出的顶点相关联的顶点的度减1,并判断关联顶点的度是否<=1,如果是,则也放入队列Q。直到Q中无任何顶点时,判断Q中抛出的点的数量是否等同于图中所有顶点的数量,如果等于,则无环;如果不等于,则有环。Q中抛出的点的顺序即拓扑排序的顺序。有向图求出图中所有顶点的度把图中所有入度 =0 的顶点放入队列Q中依次抛出队列Q中原创 2021-03-22 20:51:40 · 1176 阅读 · 0 评论 -
面试题:如何实现一个简单的LRU缓存设计 Java解法
LRU缓存设计题(即Java中LinkHashMap实现原理)题表设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x,原创 2021-03-16 22:21:52 · 214 阅读 · 0 评论 -
Manacher算法模板
Manacher算法模板该示例是返回字符串s中最长的回文字符串public String longestPalindrome(String s) { StringBuilder sb = new StringBuilder(); sb.append('#'); for (int i = 0; i < s.length(); i++) { sb.append(s.charAt(i)).append('#'); } int[] p = new i原创 2021-03-08 20:29:14 · 148 阅读 · 0 评论 -
计数排序的原理及其Java实现
计数排序的原理及其Java实现计数排序是一种线性时间复杂度的排序算法,当输入的元素是n个0到k的整数时,时间复杂度为O(n + k)。计数排序的核心在于它会将输入的数据值转化为键存储在额外开辟的数组空间中,它要求排序的内容必须是有确定范围的整数。计数排序在排序过程中没有进行比较,排序的速度超过所有的比较排序方法。计数排序是用来排序0到100之间(小范围)的数字的最好的算法。通俗地理解,例如有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得原创 2020-10-26 21:22:50 · 195 阅读 · 0 评论 -
KMP算法实现思路——附带Leetcode 1392最长快乐前缀和28实现strStr()的KMP解法 Java语言
KMP算法实现思路——附带Leetcode 1392最长快乐前缀和28实现strStr()的KMP解法 Java语言文章目录KMP算法实现思路——附带Leetcode 1392最长快乐前缀和28实现strStr()的KMP解法 Java语言目标问题KMP算法创建部分匹配表滑动并剪枝目标问题KMP算法主要用于解决字符串匹配相关等问题,实施起来简单,但是过程精巧。如题在bacbababaabcbab字符串中寻找abababca字符串的位置。一般的思路会是从字符串头开始逐一匹配,再逐一滑动,如果不做任何剪原创 2020-09-19 23:37:45 · 189 阅读 · 0 评论 -
二叉树前序遍历、中序遍历、后序遍历的递归和非递归写法
二叉树前中后三种遍历方式的递归和非递归写法本文所用的二叉树节点定义如下public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = va原创 2020-08-19 20:23:44 · 296 阅读 · 0 评论 -
排序算法的比较
转载 2019-10-05 12:51:36 · 130 阅读 · 0 评论 -
堆排序的分析与Java实现
堆排序的分析与Java实现基本原理堆是一颗完全二叉树(非整二叉树),可以用数组来实现。一般分为最大堆和最小堆最大堆的性质是堆中每一个节点的值都小于其父亲节点的值最小堆的性质是堆中每一个节点的值都大于其父亲节点的值具体关于堆的介绍,可以看我之前写过的二叉堆的数据结构。无序数组建立堆的直接方法是从左到右遍历数组进行上浮操作。用途最广泛的操作是从右至左使用下沉操作,称为Heapify。明...原创 2019-10-05 12:48:30 · 165 阅读 · 0 评论 -
快速排序的分析与Java实现
文章目录一、基本算法性能分析二、算法改进1、切换到插入排序2、三数取中3、三路快速排序三、基于切分思想的快速选择算法一、基本算法归并排序是将数组从中间切分为两个子数组分别排序,之后将两个子数组合并从而使得整个数组排序。快速排序虽然也是通过切分操作来进行排序,但它用不到合并操作。原因就在于,快速排序是通过一个切分元素来将数组切分为两个子数组,左子数组的元素都小于切分元素,右子数组的元素都大于切...原创 2019-10-04 13:46:02 · 174 阅读 · 0 评论 -
归并排序的Java实现
归并排序的Java实现归并排序的思想就是将数组拆分成两部分,分别进行排序,然后再归并起来。它运用了分而治之的思想。它的时间复杂度只有O(NlogN)O(NlogN)O(NlogN)由此引出两种归并排序方式:1、自顶向下归并排序,使用递归从上往下拆分可以完成2、自底向上归并排序,先归并微型数组,再归并得到的数组以此合并成排序好的数组。无优化版本以下的版本是没有做任何优化的归并排序方式i...原创 2019-10-03 11:52:37 · 253 阅读 · 0 评论 -
希尔排序
Java实现希尔排序希尔排序即插入排序的优化版插入排序当遇到大规模数组时,因它只能交换相邻的元素,所以排序速度很慢。希尔排序则使用插入排序的方式对间隔h的元素进行排序交换,即对下标分别为i, i+h, i+h+h ...的序列进行排序,通过不断地减小h,最后令h = 1,就可以实现整个数组的有序。通常h取值为(1,4,13…)即h=h∗3+1h = h*3 + 1h=h∗3+1希尔排序的运...原创 2019-10-02 22:15:54 · 135 阅读 · 0 评论 -
插入排序
Java实现插入排序插入排序(从小到大)方法:从左向右遍历,每次将元素插入左侧已经排好序的数组中,使得插入后左侧数组依然有序,具体插入方式是采用相邻元素逆序交换的方式。因此如果数组部分有序,逆序较少,时间复杂度会较低;而如果数组是倒序的,逆序较多,时间复杂度会很高插入排序的时间复杂度取决于数组的初始顺序:最好的情况下,数组原先是有序的,需要N−1N-1N−1次比较,O(n)O(n)O(n...原创 2019-10-02 20:41:32 · 104 阅读 · 0 评论 -
冒泡排序(改进版)
Java实现的冒泡排序改进版/** * 冒泡排序(从小到大) * 从左到右不断遍历,将相邻且逆序(大, 小)的元素交换(小, 大) * 一轮循环后,最大的元素被上浮到最右侧 * 除去最后一个元素,剩下的数组继续如上操作 * 如果有一轮循环没有发生交换操作,则说明数组已经有序,终止循环 * * @Author Nino 2019/10/2 */import java.util....原创 2019-10-02 19:43:51 · 322 阅读 · 0 评论 -
选择排序
选择排序代码:/** * 选择排序(从小到大) * 从数组中选择最小的元素,与数组中第一个元素交换位置。 * 再从数组剩下的元素中选择最小的元素,与第二个元素交换位置。 * 不断地进行这样的操作,直到整个数组排序结束。 * * @Author Nino 2019/10/2 */public class SelectionSort<E extends Comparable...原创 2019-10-02 19:10:25 · 104 阅读 · 0 评论