![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录
文章平均质量分 72
yogurt=b
这个作者很懒,什么都没留下…
展开
-
【代码随想录】【二叉树】基础知识和DFS的递归和迭代算法
int val;原创 2023-09-06 16:44:42 · 100 阅读 · 0 评论 -
【代码随想录】【二叉树】层序遍历BSP
在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)时间内计算出当前二叉树的最大深度。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。判断为叶子结点则结束遍历返回最小深度,广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点。(即从左到右,逐层遍历)。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。原创 2023-09-06 11:20:28 · 26 阅读 · 0 评论 -
【代码随想录】【栈与队列】
在每一步操作中,我们根据当前元素的大小以及队列中已有的索引,选择移除不再需要的索引,以保持队列的递减有序性。使用队列作为滑动窗口。每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。原创 2023-08-30 16:42:27 · 81 阅读 · 0 评论 -
【代码随想录】【字符串】
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。令n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。因为字符串s的最长相同前后缀的长度一定是不包含s本身,所以 最长相同前后缀长度必然是m * x,而且 n - m = 1,(这里如果不懂,看上面的推理)原创 2023-08-28 21:29:20 · 56 阅读 · 0 评论 -
【代码随想录】【哈希表】数组结构2
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n。接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。原创 2023-08-25 17:09:08 · 47 阅读 · 1 评论 -
【代码随想录】【哈希表】map结构
3、在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。原创 2023-08-24 23:48:36 · 46 阅读 · 1 评论 -
【代码随想录】【哈希表】set结构
如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。c++ stl容器set成员函数:begin()–返回指向第一个元素的迭代器c++ stl容器set成员函数:clear()–清除所有元素c++ stl容器set成员函数:count()–返回某个值元素的个数c++ stl容器set成员函数:empty()–如果集合为空,返回truec++ stl容器set成员函数:end()–返回指向最后一个元素的迭代器。原创 2023-08-12 21:48:26 · 104 阅读 · 1 评论 -
【代码随想录】【哈希表】字母异位词(数组结构)
由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组,初始化为0,先遍历记录 s 中字符出现的频次,再遍历 t 数组减去数组中对应数组出现的频次,若数组中某个字符频次小于0,则 t 包含不在 s 中的字符,返回false。由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。原创 2023-08-10 17:15:17 · 219 阅读 · 1 评论 -
【代码随想录】【链表】链表相交+环形链表
如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 headB\textit{headB}headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。原创 2023-08-07 23:21:27 · 53 阅读 · 1 评论 -
【代码随想录】【链表】交换节点+删除倒数节点
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。遍历链表,每次处理三个节点间的指向变换。原创 2023-07-29 15:08:03 · 36 阅读 · 0 评论 -
【代码随想录】【链表】反转链表(全局和局部)
请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。:永远指向 curr 的下一个节点,即待头插的节点。考虑从left为头结点的情况,要使用前一节点的next指针,所以一般情况下必须定义一个虚拟头结点。:指向待反转区域的第一个节点,也是待头插的节点的前一个节点,也是反转完毕后的最后一个节点;:永远指向待反转区域的第一个节点的前一个节点,用于连接新的头插结点,在循环过程中不变。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。改变链表的next指针的指向。原创 2023-07-28 14:06:57 · 62 阅读 · 1 评论 -
【代码随想录】【链表】设计链表
单链表中的节点应该具备两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。你可以选择使用单链表或者双链表,设计并实现自己的链表。重点是设置一个虚拟头结点再进行操作。原创 2023-07-27 13:03:33 · 39 阅读 · 1 评论 -
【代码随想录】【链表】理论基础+移除链表
/ 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数如果不定义构造函数,初始化时不能直接赋值。原创 2023-07-26 20:05:19 · 34 阅读 · 1 评论 -
【代码随想录】【数组】二分查找
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n)的算法解决此问题。原创 2023-05-10 17:27:36 · 114 阅读 · 0 评论 -
【代码随想录】【数组】螺旋矩阵
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。注意会导致奇数n最后一个单独的位置构成的行要单独赋值。1.每次填充一个拐点和一行或一列(不包括下个拐点)坚持循环不变量原则。2、每次填充完一整行。原创 2023-07-25 23:54:16 · 44 阅读 · 0 评论 -
【代码随想录】【数组】滑动窗口
双指针和滑动窗口是有些许区别的。滑动窗口就是右指针先出发,左指针视情况追赶右指针。因此,右指针最多遍历一遍数组,左指针也最多遍历一次数组,时间复杂度不超过O(2N)。最小滑窗模板(如76,209):给定数组 nums,定义滑窗的左右边界 i, j,求满足某个条件的滑窗的最小长度。判断[i, j]是否满足条件while 满足条件:不断更新结果(注意在while内更新!i += 1 (最大程度的压缩i,使得滑窗尽可能的小)j += 1。原创 2023-07-24 00:28:09 · 145 阅读 · 0 评论 -
【代码随想录】【数组】移除元素
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。同样地,我们可以使用两个指针分别指向位置 000 和 n−1n-1n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。元素的顺序可以改变。原创 2023-07-01 19:04:22 · 85 阅读 · 0 评论