算法
文章平均质量分 93
大叶子不小
这个作者很懒,什么都没留下…
展开
-
十大经典排序算法(动图演示)
转载自:https://www.cnblogs.com/onepixel/articles/7674659.html0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原.原创 2021-02-23 16:55:22 · 229 阅读 · 0 评论 -
Arrays.sort和Collections.sort排序方法跟踪源码发现
从源码上看,基本类型的排序都是使用了DualPivotQuicksort的排序方法。DualPivotQuicksort是快排的一种优化。 当参数类型为对象数组时,使用的TimSort。双轴快排:***快速排序***使用的是分治思想,将原问题分成若干个子问题进行递归解决。选择一个元素作为轴(pivot),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比轴元素小,另外一部分的所有数据都比轴元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据原创 2020-09-16 09:34:38 · 191 阅读 · 0 评论 -
Java中的Collections#sort方法的时间复杂度是多少
参考:https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29https://stackoverflow.com/questions/4254122/what-is-the-time-complexity-of-java-util-collections-sort-method这取决于您使用的Java版本.但是最后,Big-O时间复杂度仍然是O(N * log(N)).对于原创 2020-09-14 14:26:37 · 2989 阅读 · 0 评论 -
269. 火星词典--拓扑排序
现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同。假设,您并不知道其中字母之间的先后顺序。但是,会收到词典中获得一个 不为空的 单词列表。因为是从词典中获得的,所以该单词列表内的单词已经 按这门新语言的字母顺序进行了排序。您需要根据这个输入的列表,还原出此语言中已知的字母顺序。示例 1:输入:[“wrt”,“wrf”,“er”,“ett”,“rftt”]输出: “wertf”示例 2:输入:[“z”,“x”]输出: “zx”示例 3:输入:[“z”,原创 2020-08-25 17:02:38 · 259 阅读 · 0 评论 -
133克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node {public int val;public List neighbors;}解题思路:这道题就是遍历整个图,所以遍历时候要记录已经访问点,我们用一个字典记录。所以,遍历方法就有两种。思路一:DFS (深度遍历)思路二:BFS (广度遍历)!!! 大家重点掌握,后面图遍历都和这个有关系!代码:思路一:Pyt原创 2020-08-12 07:50:51 · 92 阅读 · 0 评论 -
并查集 (课程表)
课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: fal.原创 2020-08-07 08:56:57 · 292 阅读 · 1 评论 -
337打家劫舍
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ 3原创 2020-08-05 11:24:36 · 146 阅读 · 0 评论 -
最小栈
当时想到了一个栈,两个栈,但都是同步的,让优化没想出来,用异步的方式会有一定的空间复杂度的优化设计实现一个栈,数据类型为整数,需要实现push、pop和getMin方法(返回当前栈内最小值)。要求每个方法执行的时间复杂度为O(1),空间复杂度不限。[-100000,100000] 示例 入栈元素为5、10、5、7、3、6,则当前栈的最小值为3 当栈依次弹出3个元素6、3、7后,则当前栈的最小值为5设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push原创 2020-07-24 15:37:21 · 176 阅读 · 0 评论 -
常用算法复杂度速查表,蹲坑的功夫都能背
前 言复杂度通常会使用大 -O记号来表示,比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」,但是即使每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度(特别是在最好、最坏和平均情形下的复杂度)。因此制作一个 「速查表」 来集中总结是非常有必要的!这样考前、面试前,即使蹲坑的功夫都能背上个几遍,这样记得就更牢固了。动手前先看看是否已经有轮子是一个好习惯,果不其然,找到了原作。http://bigocheatsheet.com/图 例抽象数原创 2020-07-23 09:56:57 · 114 阅读 · 0 评论 -
十大经典排序
1. 冒泡排序每一次比较完就要立即交换比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。2.选择排序比较完所有的元素,只交换需要交换的两个元素,减少交换次数首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置再从剩余未排序元素中继续寻找最小(大)元素,然后放到原创 2020-07-22 10:54:40 · 166 阅读 · 0 评论 -
SingleNumber
https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484505&idx=1&sn=4c1c056dd4852c3b4b1ead51c90a9b2d&chksm=fa0e6bd8cd79e2ce8188dcdd8843a5d071248906bfb8971c62d513dbd69b816acc191a78e4b2&scene=21#wechat_redirect题目描述给定一个非空整数数组,除了某个元原创 2020-07-22 09:18:21 · 130 阅读 · 0 评论 -
求两个单链表相交节点
问题 已知两条单链表,求相交节点,如果没有的话返回null。(要求不得使用额外空间,且时间复杂度为O(n))public class Node { public Node nextNode; public Object val; public Node(Object val) { this.val = val; }}12345.63456345.1234512345345345public Node getIntersectionNode(Node p, Nod.原创 2020-07-22 07:27:52 · 219 阅读 · 0 评论 -
唯一ID生成器snowflake
分布式全局唯一ID生成器很多场景需要使用全局唯一ID,用来标识唯一一条消息,唯一一笔交易,唯一一个用户,唯一一张图片等等。传统数据库表的自增主键是很简单的一种实现方式,前提是你没有分库,也没有分表,如果你分表了,id就会重复,失去唯一性:当然,通过数据库的一些配置,使不同的分表以不同的起始值但是相同的步长自增,可以绕开这个限制:但是,如果哪天发现数据量增大,原先的分表不够用了,需要扩容,这时,就很麻烦很难搞了。所以,如果存在一种和业务数据无关的全局唯一ID生成器就好了。开动脑筋,我们能想到的有原创 2020-07-17 15:35:26 · 300 阅读 · 0 评论 -
布隆过滤器
问题假设你现在要处理这样一个问题,你有一个网站并且拥有很多访客,每当有用户访问时,你想知道这个ip是不是第一次访问你的网站。这是一个很常见的场景,为了完成这个功能,你很容易就会想到下面这个解决方案:把访客的ip存进一个hash表中,每当有新的访客到来时,先检查哈希表中是否有改访客的ip,如果有则说明该访客在黑名单中。你还知道,hash表的存取时间复杂度都是O(1),效率很高,因此你对你的方案很是满意。然后我们假设你的网站已经被1亿个用户访问过,每个ip的长度是15,那么你一共需要15 * 100000原创 2020-07-17 15:15:49 · 185 阅读 · 0 评论 -
时间轮
目录从定时任务说起初识时间轮绝对时间和相对时间时间刻度不够用怎么办?### 增大时间轮的刻度列表中的任务中添加round属性## 分层时间轮https://blog.csdn.net/xinzhongtianxia/article/details/86221241从定时任务说起自然界中定时任务无处不在,太阳每天东升西落,候鸟的迁徙,树木的年轮,人们每天按时上班,每个月按时发工资、交房租,四季轮换,潮涨潮落,等等,从某种意义上说,都可以认为是定时任务。大概很少有.原创 2020-07-17 14:53:53 · 164 阅读 · 0 评论 -
最长公共子序列和最长公共子串
目录1. 最长公共子序列(LCS)1.1 问题描述1.2 思路1.3 Python代码1.4 找到具体的子序列2. 最长公共子串2.1 问题描述2.2 思路2.3 Python代码1. 最长公共子序列(LCS)1.1 问题描述1.2 思路利用动态规划。下一步就要找到状态之间的转换方程。因此可以根据这个方程来进行填表,以"helloworld"和“loop”为例:1.3 Python代码def LCS(strin.原创 2020-07-13 15:49:51 · 302 阅读 · 0 评论