
代码随想录
文章平均质量分 87
轻舟未过万重山ing
日拱一卒,功不唐捐。日常分享技术记录,点点关注不迷路。
展开
-
二叉树中序遍历-递归法详解-数据结构与算法
⑤按照顺序继续执行,接下来将使用递归遍历D的右子树 这里D的右子树为NULL 所以我们传入的递归参数也为NULL 检测到root为NULL,我们退出该层递归函数。该层递归函数的root为D 左右子树都为NULL 我们检查root是否为NULL root为D,不为NULL。⑪在该层执行下一行代码 输出A 继续遍历A的右子树 A的右子树为C 其不为NULL 递归C的左子树F。⑭递归C的右子树G 判断该层递归的root是否为NULL 当前root为G,不为NULL。原创 2024-07-03 16:34:08 · 850 阅读 · 0 评论 -
模拟笔试 - 卡码网周赛第十九期(23年小红书提前批笔试真题)
longint因为在一些情况下,特别是当输入的n和k值很大时,计算出的可能会超出int类型的范围。,应该使用更大的数据类型来存储和计算结果。在 Java 中,我们可以使用long类型来代替int,因为long的取值范围比int大得多。nk。原创 2024-05-30 22:07:44 · 454 阅读 · 0 评论 -
ACM模式输入输出总结2【大厂笔试/OD机考】(Java语言版本)
此类输入一般只包含单个字符串,如: abc1232.输入数字此类输入一般只包含单个数字,如:53.输入字符串数组此类输入一般会先在第一行输入长度,再在第二行输入长度为的数组。数组可能会用空格隔开,如:数组可能会用逗号隔开,如:4.输入数字型数组此类输入一般会先在第一行输入长度,再在第二行输入长度为的数组。数组可能会用空格隔开,如或者(可以处理数组长度未知的输入)数组可能会用逗号隔开,如:5.输入二维数组此类输入一般会先在第一行输入二维数组的行数和列数原创 2024-05-30 21:43:19 · 641 阅读 · 0 评论 -
动态规划之背包问题中如何确定遍历顺序的问题-组合or排列?
细心的同学看网上的题解,可能看一篇是遍历背包的for循环放外面,看一篇又是遍历背包的for循环放里面,看多了都看晕了,到底两个for循环应该是什么先后关系。能把遍历顺序讲明白的文章几乎找不到!这也是大多数同学学习动态规划的苦恼所在,有的时候递推公式很简单,难在遍历顺序上!但最终又可以稀里糊涂的把题目过了,也不知道为什么这样可以过,反正就是过了。那么这篇文章就把遍历顺序分析的清清楚楚。动态规划:518.零钱兑换II (opens new window)中求的是组合数,原创 2024-05-26 21:02:41 · 1120 阅读 · 0 评论 -
动态规划之完全背包问题理论基础
这个简单的完全背包问题,估计就可以难住不少候选人了。原创 2024-05-26 16:49:48 · 814 阅读 · 0 评论 -
模拟笔试 - 卡码网周赛第十八期(23年科大讯飞提前批笔试真题)
String的replace()方法,在 输出格式中很常用!原创 2024-05-23 20:48:09 · 700 阅读 · 0 评论 -
动态规划之0-1背包问题理论基础-02(滚动数组)
以上的讲解可以开发一道面试题目(毕竟力扣上没原题)。就是本文中的题目,要求先实现一个纯二维的01背包,如果写出来了,然后再问为什么两个for循环的嵌套顺序这么写?反过来写行不行?再讲一讲初始化的逻辑。然后要求实现一个一维数组的01背包,最后再问,一维数组的01背包,两个for循环的顺序反过来写行不行?为什么?注意以上问题都是在候选人把代码写出来的情况下才问的。就是纯01背包的题目,都不用考01背包应用类的题目就可以看出候选人对算法的理解程度了。相信大家读完这篇文章,应该对以上问题都有了答案!原创 2024-05-23 11:44:38 · 994 阅读 · 0 评论 -
动态规划之0-1背包问题理论基础-01
讲了这么多才刚刚把二维dp的01背包讲完,这里大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在如何初始化和遍历顺序上。可能有的同学并没有注意到初始化 和 遍历顺序的重要性,我们后面做力扣上背包面试题目的时候,大家就会感受出来了。讨论到a【i】【j】时的两种情况怎么操作?为什么这么操作?假设已经讨论到了a【i】【j】,即j容量下到前i个物品的讨论,有两种情况1.选择不装第i个物品,则退回到i-1行,直接选择a【i-1】【j】作为该情况下最大价值。原创 2024-05-22 21:54:47 · 647 阅读 · 0 评论 -
力扣 滑动窗口题目总结
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!原创 2024-05-21 22:12:30 · 1050 阅读 · 0 评论 -
leetcode51.N皇后(困难)-回溯法
都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。那么我们用皇后们的约束条件,来回溯搜索这棵树,原创 2024-04-29 22:19:23 · 535 阅读 · 2 评论 -
leetcode79.单词搜索 | 回溯算法 | 最通俗易懂的讲解 【java版】
单词起点一共有 n2个,单词的每个字母一共有上下左右四个方向可以选择,但由于不能走回头路,所以除了单词首字母外,仅有三种选择。深度优先搜索,我们定义这样一种搜索顺序,即先枚举单词的起点,然后依次枚举单词的每个字母。3、如果当前搜索的位置(x,y)的元素board[x][y] == word[u],则继续向四周搜索。2、从该起点出发向四周搜索单词word,并记录此时枚举到单词word的第u个位置 ( u从0开始)。1、从搜索过的位置继续搜索下一层时,需要对当前位置进行标识,表示已经搜索。原创 2024-04-26 17:31:03 · 554 阅读 · 1 评论 -
leetcode1143. 最长公共子序列(ACM模式解法)
给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。例如:Z=是序列X=的一个子序列,Z中的元素在X中的下标序列为。现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?对于每组输入,输出两个字符串的最长公共子序列的长度。原创 2024-04-26 17:17:25 · 354 阅读 · 0 评论 -
快速排序题目&SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)
(如果10个数,K=1,第一个最大的数,就是SelectK索引为9的那个的元素)(如果10个数,第10个最大的数,就是SelectK索引为0的那个的元素,最小值)如果 k 是 nums.length,其实就是求最小元素,那么相应的我们的 selectK 的。非常简单,我们只需要在调用 select K 之前,将求第 k 大元素的这个 k,转换成。注意,因为在这个问题中,我们肯定我们处理的数据类型是 int,所以,在代码。按照题目描述,如果 k 是 1,对应就是要找最大元素,那么相应的我们的。原创 2024-04-16 22:59:29 · 1015 阅读 · 0 评论 -
代码随想录算法训练营day23||二叉树part09、● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
在二叉树:构造二叉树登场!和二叉树:构造一棵最大的二叉树 (opens new window)之后,我们顺理成章的应该构造一下二叉搜索树了,一不小心还是一棵平衡二叉搜索树。其实思路也是一样的,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。此时相信大家应该对通过递归函数的返回值来增删二叉树很熟悉了,这也是常规操作。在定义区间的过程中我们又一次强调了循环不变量的重要性。最后依然给出迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。原创 2024-02-24 16:43:23 · 922 阅读 · 0 评论 -
代码随想录算法训练营day22||二叉树part08、● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题 (opens new window)简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。读完本篇,大家会发现二叉搜索树删除节点比增加节点复杂的多。因为二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。原创 2024-02-23 21:51:08 · 1279 阅读 · 0 评论 -
代码随想录算法训练营day19||二叉树part06、654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
这道题目其实和二叉树:构造二叉树登场!是一个思路,比二叉树:构造二叉树登场!还简单一些。注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。一些同学也会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。其实就是不同代码风格的实现,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。原创 2024-02-22 21:31:29 · 985 阅读 · 0 评论 -
代码随想录算法训练营day18||二叉树part05、513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构
递归求深度的写法,我们在110.平衡二叉树 (opens new window)中详细的分析了深度应该怎么求,高度应该怎么求。递归中其实隐藏了回溯,在257. 二叉树的所有路径 (opens new window)中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。层次遍历,在二叉树:层序遍历登场!深度讲解了二叉树层次遍历。所以本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。原创 2024-02-22 15:47:14 · 709 阅读 · 0 评论 -
代码随想录算法训练营day17||二叉树part04、110.平衡二叉树 、257. 二叉树的所有路径 、404.左叶子之和
注意:迭代法,可以先过,二刷有精力的时候 再去掌握迭代法。110.平衡二叉树 (优先掌握递归)再一次涉及到,什么是,什么是,可以巩固一下。题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 返回 true。示例2:返回false。原创 2024-02-19 19:49:37 · 1192 阅读 · 0 评论 -
代码随想录算法训练营day16||二叉树part03、104.二叉树的最大深度 、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
3.确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。思路:本题要搞懂:什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。时间复杂度:O(n);原创 2024-02-17 22:44:40 · 1122 阅读 · 1 评论 -
代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)
二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时又发现队列的一个应用了)。102.二叉树的层序遍历(opens new window)107.二叉树的层次遍历II(opens new window)199.二叉树的右视图(opens new window)637.二叉树的层平均值(opens new window)429.N叉树的层序遍历(opens new window)515.在每个树行中找最大值(opens new window)原创 2024-02-09 17:16:35 · 911 阅读 · 1 评论 -
代码随想录算法训练营day14||二叉树part01、理论基础、递归遍历、迭代遍历、统一迭代
这里帮助大家确定下来递归算法的三个要素。原创 2024-02-08 23:06:06 · 877 阅读 · 0 评论 -
代码随想录算法训练营day13|| 239. 滑动窗口最大值、347.前 K个高频元素、总结
寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)大家对这个比较运算在建堆时是如何应用的,为什么左大于右就会建立小顶堆,反而建立大顶堆比较困惑。确实 例如我们在写快排的cmp函数的时候,原创 2024-02-07 23:46:33 · 638 阅读 · 1 评论 -
代码随想录算法训练营day11|| 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。(在实际使用中,Deque接口使用的是比较多的,栈和队列都可以使用该接口,这个接口中有栈的方法,也有队列的方法)从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。原创 2024-02-03 17:07:47 · 1470 阅读 · 1 评论 -
代码随想录算法训练营day10|| 栈与队列基础、232.用栈实现队列、225. 用队列实现栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。压栈:向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;出栈:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。:new(新建)push(入栈)pop(出栈)peek(获取栈顶元素)isEmpty(判断栈是否为空)原创 2024-02-02 22:48:14 · 1223 阅读 · 0 评论 -
代码随想录算法训练营day09|| 字符串总结 、双指针回顾
字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。双指针法是字符串处理的常客。KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易,我们已经写了五篇KMP的文章,不断总结和完善,最终才把KMP讲清楚。相信大家已经对双指针法很熟悉了,但是双指针法并不隶属于某一种数据结构,我们在讲解数组,链表,字符串都用到了双指针法,所有有必要针对双指针法做一个总结。原创 2024-02-01 20:19:29 · 1066 阅读 · 0 评论 -
代码随想录算法训练营day09|| 28. 实现 strStr()、459.重复的子字符串
写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。请记住文本串和模式串的作用,对于理解下文很重要,要不然容易看懵。所以说三遍动画里,我特意把 子串aa标记上了,这是有原因的,大家先注意一下,后面还会说到。原创 2024-02-01 17:10:31 · 1067 阅读 · 1 评论 -
代码随想录算法训练营day08|| 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
String 是不可变的,而 StringBuffer 和 StringBuilder 是可变类。StringBuffer 是线程安全和同步的,而 StringBuilder 不是。这就是 StringBuilder 比 StringBuffer 快的原因。字符串连接运算符 (+) 在内部使用 StringBuilder 类。对于非多线程环境中的字符串操作,我们应该使用 StringBuilder 否则使用 StringBuffer 类。原创 2024-01-31 20:56:07 · 664 阅读 · 0 评论 -
代码随想录算法训练营day06||哈希表基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
①没有使用泛型每次元素返回的都是Object类型的元素,Object中没有我们想要返回的类型的方法,所以需要强转.使用了泛型之后调父类中的方法不需要转型了,使用迭代器的时候表示迭代器迭代的是泛型类型的了.但是要注意如果要调用子类中特有的方法,仍然需要向下转型.②指定了泛型之后,只能往集合里面存储泛型的这种数据类型,或者他的子类.元素类型被统一了。原创 2024-01-29 20:18:25 · 1343 阅读 · 0 评论 -
代码随想录算法训练营day05||休息日第二章总结:链表总结篇
这就造成了,头结点的尴尬,因为头结点没有前一个节点了。建议大家先学透迭代法,然后再看递归法,因为递归法比较绕,如果迭代还写不明白,递归基本也写不明白了。因为反转链表的代码相对简单,有的同学可能直接背下来了,但一写还是容易出问题。在707.设计链表中,我们通设计链表把链表常见的五个操作练习了一遍。在142环形链表2中,讲解了在链表如何找环,以及如何找环的入口位置。在前面的总结中,给出了两种反转的方式,迭代法(双指针法)和递归法。这里依然使用了虚拟头结点的技巧,复习的时候,可以去看一下代码。原创 2024-01-28 17:24:18 · 370 阅读 · 0 评论 -
代码随想录算法训练营day04||24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
链表交点不是数值相等,而是指针相等。原创 2024-01-27 20:12:08 · 1081 阅读 · 1 评论 -
代码随想录算法训练营day03||203.移除链表元素 、707.设计链表 、206.反转链表
链表节点的定义,很多同学在面试的时候都写不好。这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定义的。// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数int val;// 结点的值// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)原创 2024-01-26 17:40:47 · 1322 阅读 · 0 评论 -
代码随想录算法训练营day02||第一章总结:数组总结篇
首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。如图所示:需要两点注意的是正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示:而且如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器转载 2024-01-25 15:33:12 · 929 阅读 · 0 评论 -
代码随想录算法训练营day02||977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II ;数组总结
第一章数组02原创 2024-01-25 15:21:17 · 1113 阅读 · 0 评论 -
代码随想录算法训练营day01||704.二分查找、27.移除元素
第一章。原创 2024-01-24 17:19:15 · 538 阅读 · 0 评论