数据结构与算法
文章平均质量分 72
fFee-ops
it's tough.
展开
-
补充题搜集
补充题搜集1、排序奇升偶降链表思路代码2、36进制加法思路代码3、木头切割问题思路代码4、1、排序奇升偶降链表给定一个奇数位升序,偶数位降序的链表,将其重新排序。输入: 1->8->3->6->5->4->7->2->NULL输出: 1->2->3->4->5->6->7->8->NULL思路按奇偶位置拆分链表,得1->3->5->7->NULL和8->6->4原创 2021-08-31 16:22:55 · 259 阅读 · 0 评论 -
圆环回原点问题
10个城市编号0~9,城市之间移动只能前后移动(比如5只能到4或者6),10个城市构成一个环,从0可以到9,从9也可以到0。从任意城市X出发,途径N个城市,问有多少途径?public class Main { //dp + 递归 static int solution(int X, int N){ int result = recur(X, X + 1, N); return result * 2; } static int recur(i原创 2021-08-28 21:46:33 · 400 阅读 · 0 评论 -
一致性hash算法
一致性hash算法前置场景出现的问题一致性hash算法优点hash环的偏斜前置场景在没有一致性hash算法之前,我们会遇到这种场景,假如现在有三张图片,要均匀的存放在三台缓存服务器上去,那么我们会以图片名为key进行hash运算,再对结果取余。也就是hash(图片名称)% N n就是服务器台数。出现的问题问题1:当缓存服务器数量发生变化时,会引起缓存的雪崩,可能会引起整体系统压力过大而崩溃(大量缓存同一时间失效)。问题2:当缓存服务器数量发生变化时,几乎所有缓存的位置都会发生改变,怎样才能尽量减原创 2021-08-16 11:26:57 · 103 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法适用场景算法流程落地实现需要的数据结构适用场景单源最短路问题可以使用 Dijkstra 算法。例如lc743.网络延迟时间算法流程首先,Dijkstra 算法需要从当前全部未确定最短路的点中,找到距离源点最短的点 x。同时标记x为下次的出发点,并且更新源点到其它点的距离当全部其他点都遍历完成后,一次循环结束,将 x 标记为已经确定最短路。进入下一轮循环,直到全部点被标记为确定了最短路。举例⬇️将顶点 0 进行标识,并作为点 xx,更新其到其他所有点的距离。一轮循环原创 2021-08-02 18:26:58 · 111 阅读 · 0 评论 -
8 大排序算法总结
面试中的 8 大排序算法总结冒泡排序选择排序插入排序快速排序堆排序希尔排序归并排序基数排序总结冒泡排序冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。基本原理将序列当中的左右元素,依次比较,如果左边的元素大于右边元素则交换位置,保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)对序列当中剩下的n-1个元素再次执行步骤1。对于长度为n的序列,一共需要执行n-1轮比较。原创 2021-02-19 22:02:47 · 169 阅读 · 0 评论 -
Trie树(前缀树)
Trie树是什么Trie树的优缺点优点缺点是什么Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图:从上图可以归纳出Trie树的基本性质:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)。Trie树把每个关键字保存在一条路径上,原创 2021-01-20 22:20:59 · 339 阅读 · 0 评论 -
贪心算法(Greedy Algorithm)
贪心算法基本要素贪心选择常见应用场景贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。基本要素贪心选择贪心选择是指原创 2020-10-15 09:28:44 · 5939 阅读 · 3 评论 -
时间复杂度和空间复杂度
时间复杂度和空间复杂度时间复杂度常见的时间复杂度量级常数阶O(1)线性阶O(n)对数阶O(logN)线性对数阶O(nlogN)平方阶O(n²)空间复杂度空间复杂度 O(1)空间复杂度 O(n)时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。时间复杂度要知道一个算法的时间复杂度有两种方法1、直接运行(不推荐)2、大O符号表示法在 大O符号表示法中,时间复杂度的公式是: T(n) = O( f(原创 2020-09-18 00:07:38 · 118 阅读 · 0 评论 -
冒泡排序
文章目录基本原理代码实现基础实现基本原理将序列当中的左右元素,依次比较,如果左边的元素大于右边元素则交换位置,保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)对序列当中剩下的n-1个元素再次执行步骤1。对于长度为n的序列,一共需要执行n-1轮比较。代码实现基础实现/** * 冒泡排序的第一种实现, 没有任何优化 */public class HelloWorld { public static void main(String[] arg原创 2020-06-04 21:45:34 · 205 阅读 · 0 评论 -
选择排序
文章目录基本思想时间复杂度代码实现基本思想给定一组记录,经过第一轮比较后得到最小的值,并将其与数组第一个位置的元素进行交换,接着从数组第二个位置的元素开始与其余元素比较,求出最大值,与数组第二个位置的元素交换位置,以此类推。直到只剩下一个元素不需要比较。简单来说就说( 遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序。)时间复杂度分析它的时间复杂度发现,无论是最好最差情况,其比较次数都是一样多,第 i 趟排原创 2020-06-04 12:27:04 · 146 阅读 · 0 评论