算法和数据结构
文章平均质量分 80
monday-pro
这个作者很懒,什么都没留下…
展开
-
动态规划(1)
文章目录一、暴力递归是啥二、动态规划是啥三、机器人移动问题1、题目描述2、思路1 从尝试开始3、思路2 傻缓存法优化4、最终版的动态规划四、纸牌问题1、题目描述2、思路1 从尝试开始3、思路2 傻缓存法优化4、最终版的动态规划前一篇我们仔细聊了聊递归,如果大伙都仔细敲了相关代码,没有收获那是不可能的。同时敏锐的伙伴可能也发现了,接下来我们要说啥了——动态规划,对,终于终于我们聊到动态规划了。提到动态规划,不知道你们第一反应是啥,难?别人的帖子看不懂?这些都不是事儿,跟着我的步伐一步一步往下走,等更完几篇原创 2022-01-27 21:01:25 · 332 阅读 · 1 评论 -
从 最具启发性的汉诺塔问题开始 聊递归
文章目录一、最具启发性的汉诺塔问题1、汉诺塔问题描述2、从最初开始3、优化二、打印一个字符串的全部子序列1、子序列定义2、代码三、打印一个字符串的全部子序列,没有重复值四、打印一个字符串的全部全排列1、全排列定义2、采用舍弃添加的方式(1)递归过程如下(2)代码3、一直在原始字符串上以交换的方式进行递归(1)递归过程如下(2)代码五、打印一个字符串的全部全排列,没有重复值1、代码2、为啥我们不采用Set的方式来去重?六、栈的逆序1、得到栈底元素(1)代码(2)过程2、递归逆序(1)代码(2)过程本文篇幅较原创 2022-01-26 11:14:21 · 441 阅读 · 0 评论 -
图的关键算法
文章目录一、概念1、有向图和无向图二、图的表示1、邻接表2、邻接矩阵3、常见的表示法三、图的解决思路四、图的宽度优先和深度优先遍历1、宽度优先遍历2、深度优先遍历3、图的拓扑排序五、最小生成树算法1、Kruskal算法2、Prim算法六、Dijkstra算法(迪杰斯特拉算法)1、含义2、作用3、代码思路4、使用加强堆优化七、本文所有代码地址一、概念图(Graph)是用于表示物体与物体之间存在某种关系的结构。数学抽象后的“物体”称作节点或顶点(Vertex,node或point),节点间的相关关系则称作边原创 2022-01-23 09:22:59 · 461 阅读 · 0 评论 -
并查集练习——LeetCode200 岛屿数量
文章目录岛屿数量1、题目描述2、示例3、思路(1)使用感染的方法(2)使用并查集(3)使用优化后的并查集4、代码(1)使用感染的方法(2)使用原始并查集(3)使用优化后的并查集5、测试(1)使用染色的方法(2)使用原始并查集(3)使用优化后的并查集6、所有代码岛屿数量1、题目描述LeetCode200:https://leetcode-cn.com/problems/number-of-islands/给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是原创 2022-01-19 21:56:58 · 388 阅读 · 0 评论 -
并查集是啥
文章目录一、啥是并查集1、解释2、有啥优势3、作用二、主要操作三、路径优化压缩四、核心方法1、查找节点所在集合的代表节点2、isSameSet(V a, V b)3、union(V a, V b)五、省份数量问题1、题目描述2、示例3、思路4、代码5、LeetCode测试一、啥是并查集1、解释看下维基百科的解释啥?在说啥,看不懂?那说人话吧通俗的说,并查集是一种数据结构,指在一些有N个元素的集合应用问题中,通常在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并原创 2022-01-17 21:01:13 · 2213 阅读 · 0 评论 -
贪心算法(2):金条切割问题、点灯问题、LeetCode502 IPO问题
文章目录一、金条切割问题1、题目描述2、思路3、代码二、点灯问题1、题目描述2、思路3、代码三、IPO问题1、题目描述2、思路3、代码4、测试结果今天再讲一篇关于利用贪心算法解决的题目。一、金条切割问题1、题目描述一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管怎么切,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板?输入一个数组,返回分割的最小代价。例如:给定数组{10,20,30},代表一共三个人, 整块金条长度为10 + 20 + 30 = 60,金条原创 2022-01-14 16:32:52 · 891 阅读 · 0 评论 -
贪心算法(1)
二叉树的递归套路暂时先告一段落了,今天来聊聊贪心算法。一、什么是贪心算法1、最具自然智慧的算法用最普通的思维就能想到的解决方法。2、用一种局部最功利的标准,总是做出在当前看来是最好的选择3、难点在于证明局部最功利的标准可以得到全局最优解4、对于贪心算法的学习主要以增加阅历和经验为主对于每一个利用贪心算法求解的题目,实际采取的贪心策略都是不同的,也就是说当前的贪心策略并不能帮助你解决另外的贪心题目,但是能够增加你的经验,让你学会如何尝试。5、只要能够使用对数器校验策略是对的即可对于每一个贪心原创 2022-01-11 22:51:32 · 312 阅读 · 0 评论 -
二叉树递归套路(4):最低公共祖先、派对的最大快乐值
文章目录一、最低公共祖先1、递归套路思路2、递归套路代码二、派对的最大快乐值1、递归套路思路2、递归套路代码今天继续二叉树的递归套路。一、最低公共祖先给定一个二叉树的头节点,和另外两个节点a、b,返回a、b的最低公共祖先。最低公共祖先定义:a、b往上找,第一个相同的祖先(这个公共祖先也可能是a或b自己)1、递归套路思路对于二叉树中的任意一个节点X,以及两个节点a、b,a和b的最低公共祖先分为两种情况。(1)与X无关,即最低公共祖先不是Xa、b在左树中某个点汇聚了a、b在右树中某个点汇聚了原创 2022-01-08 17:07:40 · 559 阅读 · 0 评论 -
二叉树递归套路(3):判断是否是满二叉树、最大子搜索二叉树的节点数
文章目录一、判断是否是满二叉树1、递归套路思路2、递归套路代码二、求二叉树中最大子搜索二叉树的节点数1、递归套路思路2、递归套路代码三、二叉树递归套路总结今天继续二叉树的递归套路。一、判断是否是满二叉树满二叉树定义:对于高度为h的二叉树,节点数为(2^h - 1)1、递归套路思路根据满二叉树的定义可以知道,我们每次只需要获取高度、节点数即可。也就是每次从左子树和右子树中我们都需要 高度、节点数 两个数据,最后再根据高度和节点数的关系判断是否是满二叉树。所以可以定义如下的Info类/** *原创 2022-01-07 17:08:34 · 519 阅读 · 0 评论 -
二叉树递归套路(2):判断二叉树是否是搜索二叉树、二叉树的最大距离
文章目录一、判断二叉树是否是搜索二叉树1、经典做法2、递归套路思路3、递归套路代码二、二叉树的最大距离1、递归套路思路2、递归套路代码本篇继续来聊聊二叉树的递归套路。一、判断二叉树是否是搜索二叉树搜索二叉树定义:二叉树中的任意一个以X为头的子树,左子树都比X小,右子树都比X大。(经典的搜索二叉树是没有重复值的)1、经典做法中序遍历,结果是递增的,说明这是搜索二叉树。2、递归套路思路分析任意一个以X为头的子树,满足以X为头的子树是搜索二叉树的条件(列出所有可能性)1)左子树是搜索二叉树2)右原创 2022-01-03 21:46:40 · 498 阅读 · 0 评论 -
二叉树递归套路:判断二叉树是否是完全二叉树、判断二叉树是否是平衡二叉树
判断二叉树是否是完全二叉树、判断二叉树是否是平衡二叉树使用常规的解法大家都会,但是你知道如何用递归套路来解吗?二叉树递归套路可以解决绝大多数的二叉树问题,尤其是树型dp问题,相信看完有不一样的收获……原创 2021-12-29 21:41:16 · 1764 阅读 · 0 评论 -
查询后继节点、微软纸条折痕问题
文章目录一、查询后继节点1、思路2、代码二、纸条折痕问题1、题目描述2、思路3、代码一、查询后继节点后继节点:中序遍历时,某个节点的后一个节点即是该节点的后继节点。规定二叉树的结构如下:public static class Node { public int value; public Node left; public Node right; // 父节点 public Node parent; public Node (int v) {原创 2021-12-24 21:05:03 · 422 阅读 · 1 评论 -
求二叉树最宽的层有多少个节点
思路: 在按层遍历的基础上进行改写,准备currentLevelEnd、nextLevelEnd、currentWeight、maxWeight四个变量……原创 2021-12-22 19:16:10 · 114 阅读 · 0 评论 -
二叉树的序列化和反序列化
文章目录一、先序方式序列化和反序列化1、先序方式序列化2、先序方式反序列化二、后序方式序列化和反序列化1、后序方式序列化和反序列化和先序方式的思路和过程是一样的。2、为啥没有中序方式的序列化?三、按层方式序列化和反序列化1、序列化2、反序列化序列化的定义:序列化(serialization)是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义原创 2021-12-21 22:38:12 · 460 阅读 · 0 评论 -
二叉树基本算法
文章目录二叉树定义:一、递归遍历1、先序遍历2、中序遍历3、后序遍历4、递归序二、非递归遍历1、先序遍历2、中序遍历3、后序遍历三、二叉树按层遍历二叉树定义:二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。更多解释,详见堆和堆排序。一、递归遍历1、先序遍历根左右。a,b,d,e,c,f,g/** * 二叉树:先序遍历。根-左-右 * * 经典递归写法原创 2021-12-20 22:15:03 · 531 阅读 · 0 评论 -
有环或无环单链表的相交问题
文章目录一、题目描述二、思路1、找到单链表的入环节点,无环则返回null2、根据得到的链表的入环节点,再展开讨论(1)两个链表都无环(2)一个有环、一个无环(3)两个链表都有环1)各自有环但是不相交2)入环节点是同一个3)入环节点有两个三、详细参考代码1、找到单链表的入环节点2、根据得到的链表的入环节点,再展开讨论关于求有环无环单链表相交的问题,是链表类型题目中数一数二的难题,且听一一道来。一、题目描述给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交原创 2021-12-16 18:58:28 · 1154 阅读 · 0 评论 -
复制带随机指针的链表
文章目录一、题目描述二、示例三、思路额外空间复杂度为O(1)的写法额外空间复杂度为O(N)的写法四、源码额外空间复杂度为O(1)的写法额外空间复杂度为O(N)的写法五、测试结果额外空间复杂度为O(1)的写法额外空间复杂度为O(N)的写法LeetCode 138:复制带随机指针的链表https://leetcode-cn.com/problems/copy-list-with-random-pointer/一、题目描述给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指原创 2021-12-13 19:31:08 · 104 阅读 · 0 评论 -
将单向链表划分成左边小、中间等、右边大的形式
文章目录1、采用荷兰国旗问题求解:2、额外空间复杂度为O(1)的解法:咋一看,似乎和快排的partition过程,也就是荷兰国旗问题很相似,只是此处换成了单链表结构,实际上也确实可以采用荷兰国旗问题来求解,只是此时的额外空间复杂度为O(N)。1、采用荷兰国旗问题求解:(1)将链表放到数组中(2)使用荷兰国旗方法将数组分为小于区、等于区、大于区(3)将数组重新连成链表,返回头节点/** * @author Java和算法学习:周一 */public static Node comparato原创 2021-12-11 15:00:00 · 83 阅读 · 0 评论 -
判断链表是不是回文结构
文章目录1、额外空间复杂度为O(1)的写法:2、额外空间复杂度为O(N)的写法:啥是回文结构:一个链表正向看和反向看都是一样的。例如:1 --> 2 --> 2 --> 1,1 --> 2 --> 3 --> 2 --> 1这样的链表就具有回文结构。1、额外空间复杂度为O(1)的写法:(1)找到此链表的中点(偶数个节点则找上中点)(2)调整链表结构例如:1 --> 2 --> 3 --> 3 --> 2 --> 1,调整为:原创 2021-12-10 21:08:12 · 258 阅读 · 0 评论 -
排序算法总结
文章目录一、排序算法的稳定性二、排序算法总结三、排序算法常见的坑四、工程上对排序的改进1、稳定性的考虑2、充分利用O(N*logN)和O(N^2)排序算法各自的优势说了这么久的排序算法,是时候进行总结一下了。本文总结了排序算法的稳定性、排序算法常见的坑、工程上对排序算法的改进等。一、排序算法的稳定性稳定性定义:稳定性是指样本在排序之后不会改变相对顺序。对于基础类型来说,稳定性毫无意义对非基础类型来说,稳定性有重要意义排序算法时间复杂度额外空间复杂度稳定性选择排序O(N^原创 2021-12-08 16:45:25 · 398 阅读 · 0 评论 -
不基于比较的排序
文章目录一、计数排序1、核心思路:2、详细参考代码:二、基数排序1、核心思路:2、详细参考代码:三、基于比较的排序和不基于比较的排序对比不基于比较的排序,核心思想就是桶排序,时间复杂度都是O(N),常见的不基于比较的排序有计数排序、基数排序。一、计数排序适用于排序元素的值范围比较小的,且是整数。(例如:年龄)1、核心思路:(1)先准备一个有限个数(比如200)的整型辅助数组,挨个遍历原始数组,得到的值是 i,则将辅助数组 i 位置的值加一(2)遍历辅助数组,如果数组位置 i 上的值是k,则输出k原创 2021-12-07 22:47:53 · 712 阅读 · 0 评论 -
前缀树是啥
文章目录一、前缀树定义二、简版的前缀树三、通用的前缀树前缀树是啥,我们今天来聊聊。一、前缀树定义1)单个字符串中,字符从前到后的加到一棵多叉树上2)字符放在边上,节点上有专属的数据项(常见的是pass和end值)3)样本添加方式,每个字符串都从根节点开始加,如果没有路就新建,如果有路就复用4)添加时,沿途节点的pass值加1,每个字符串结束时来到的节点end值加1作用:可以更加方便的完成前缀相关的查询二、简版的前缀树只能存放26个小写字母组成的字符串/** * 字符种类:只有26个小写原创 2021-12-04 16:14:22 · 462 阅读 · 0 评论 -
与堆有关的题目
文章目录一、几乎有序的数组排序1、题目描述:2、解决思路:3、详细的参考代码:4、时间复杂度为O(N\*logK)二、最大线段重合问题1、题目描述:2、解决思路:3、详细的参考代码:大家好,我是周一。上次我们聊了堆和堆排序,这次我们就顺着说说和堆有关的题目。一、几乎有序的数组排序1、题目描述:已知一个几乎有序的数组,几乎有序是指,如果把数组排好序的话,每个元素移动的距离一定不超过K,并且K相对于数组长度来说是比较小的。请选择一个合适的排序策略,对这个数组进行排序。2、解决思路:从第一个数开始原创 2021-12-02 20:24:44 · 925 阅读 · 0 评论 -
荷兰国旗问题以及快速排序
戳蓝字关注我们哦!!! 大家好,我是周一。最近几篇算法,我们都是聊的归并排序,归并排序也说的差不多了,今天讲讲快速排序。 荷兰国旗问题 1、啥是荷兰国旗问题荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但不仅仅只有这一种情况:需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。原创 2021-11-27 20:15:48 · 5337 阅读 · 0 评论 -
堆和堆排序
戳蓝字关注我们哦!!!大家好,我是周一。今天我们聊聊堆,以及堆排序。堆谈到堆,首先我们要从二叉树说起,从二叉树到完全二叉树,再才到堆。1、二叉树:每个结点最多只能有两棵子树,且有左右之分2、完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中(除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树)编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。通俗的说法就是:叶子结点只原创 2021-11-25 19:51:03 · 865 阅读 · 0 评论 -
归并排序干掉的LeetCode第一个Hard题(327. 区间和的个数),帅
戳蓝字关注我们哦!!! 大家好,我是周一。最近几篇算法,我们都是聊的归并排序,今天再开一篇。再聊两题。 一、大于右侧数的两倍 怕大家忘了归并排序,所以先拿一题练练手。题目描述:求给定数组中,当前数 大于 右侧数的两倍 的个数例子:数组:[6, 7, 3, 2, 1]当前数大于右侧数的两倍的数有(6,2),(6,1),(7,3),(7,2),(7,1),(3,1)所有总共有6个。思路:认真看过小和问题和逆序对问题的伙伴都知道,我们在求解时,都是和merge操原创 2021-11-24 10:43:27 · 491 阅读 · 0 评论 -
归并排序:解决小和、逆序对问题
目录小和问题1. 题目描述:2. 例子:3. 思路:4. 详细的参考代码:逆序对问题1. 题目描述:2. 例子:3. 思路:4. 详细的参考代码:在上一篇归并排序中,我们讲了归并排序的基本概念、merge(合并)过程等,今天趁热打铁,我们来说说使用归并排序的一些常见面试题。小和问题1. 题目描述:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个给定数组的小和。2. 例子:数组为:[1,3,4,2,5]1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1原创 2021-11-19 20:22:30 · 584 阅读 · 0 评论 -
归并排序以及Master公式
目录一、概念二、排序过程三、Master公式估计时间复杂度四、代码实现1、递归方法实现2、迭代方式实现一、概念归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。二、排序过程归并操作,指的是将两个顺序序列合并成一个顺序序列的方法。如:数组 {6,202,100,301,38,8,1}初始状态:6,202,100,301,38,8,1第一次归并原创 2021-11-01 22:19:08 · 276 阅读 · 0 评论 -
基础数据结构--栈和队列的练习
目录1、如何用栈结构实现队列结构2、如何用队列结构实现栈结构1、如何用栈结构实现队列结构首先,用一个栈肯定是实现不了的。所以,考虑两个栈来实现。一个是push栈、一个是pop栈。放数据的时候往push栈放,当取数据的时候,将数据全部倒到pop栈,再从pop栈取数据。注意:(1)倒数据的时候要一次性倒完(2)如果pop栈没有拿完,不能倒数据详细代码:package basic.stackqueue;import java.util.Stack;/** * 使用栈结构实现队列结构的原创 2021-10-25 16:35:53 · 72 阅读 · 0 评论 -
基础数据结构--链表的练习
目录一、单链表和双链表反转二、单链表删除指定的值一、单链表和双链表反转public class ReverseNode { public static class Node { public int value; public Node next; public Node(int value) { this.value = value; } } public static class D原创 2021-10-21 23:10:34 · 82 阅读 · 0 评论