自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 代码随想录算法训练营第二十五天| 回溯总结

回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。回溯算法能解决如下问题:for循环横向遍历,递归纵向遍历,回溯不断调整结果集,这个理念贯穿整个回溯法系列,剪枝操作::for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了。组合问题的终止条件常常为结果组合是否数量到了或者数值到了。对于组合问题,一个集合来求组合的话,就需要index。如果是多个集合取组合,各个集合之间相互不

2024-01-11 14:21:37 565

原创 代码随想录算法训练营第二十四天| 回溯 491.递增子序列 46.全排列 47.全排列 II

此前通过used数组去重的操作的前提是需要首先给数组排序,本题不可以,因为求递增子序列时,原先的序列并不是一定递增的,此时进行排序后,此时递增子序列会包含其他原先不是原先数据的子序列。:排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。:排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。

2024-01-10 12:57:25 465

原创 代码随想录算法训练营第二十三天| 回溯 93.复原IP地址 78.子集 90.子集II

index一定是需要的,记录下一层递归分割的起始位置。还需要一个变量pointNum,记录添加逗点的数量。明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。然后验证一下第四段是否合法,如果合法就加入到结果集里在循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。如果合法就在字符串后面加上符号表示已经分割。如果不合法就结束本层循环,剪掉的分支。

2024-01-09 15:51:41 1000

原创 代码随想录算法训练营第二十二天| 回溯 39. 组合总和 40.组合总和II 131.分割回文串

注意题目说明的数值分为是1

2024-01-08 19:45:13 1014

原创 代码随想录算法训练营第二十一天| 回溯 216. 组合总和 III 17. 电话号码的字母组合

可以参考中关于选取数组的相关操作。:一般为void类型:path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,然后当n为0的时候(找到数组值为n),终止,将结果导入res中:回溯法的搜索过程就是一个树型结构的遍历过程,for循环用来横向遍历,递归的过程是纵向遍历。

2024-01-07 17:08:59 549

原创 代码随想录算法训练营第二十天| 回溯 理论基础 77. 组合

回溯是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯,。。,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

2024-01-06 15:25:46 1061 1

原创 代码随想录算法训练营第十九天| 二叉树 669. 修剪二叉搜索树 108.确定递归函数返回值及其参数

本题参看前面构造最大二叉树的方法,采用前序遍历的方法,为了让node不被size为1时不存在,在最开始首先定义node,然后找出中间结点。本题只需要理解题目就挺容易的,题目的意思为新二叉树上面的结点大小等于原二叉树比它大的所有结点的和。由于原二叉树是一个二叉搜索树,最大的值在最右下角的结点,可以从最大的开始遍历,因此本题的遍历顺序应该为右中左。:首先先找到中间结点,对于双数的数组来说,中间结点可以是左边也可以是右边,这里选择左边的(为了后续正确往右遍历而不会溢出)。:返回值为结点,参数为root,边界。

2024-01-04 14:24:09 547 1

原创 代码随想录算法训练营第十八天| 二叉树 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作

传统思想:通过val的值遍历到叶子结点,然后返回叶子结点,再判断叶子结点与val的大小。:如果root的值比pq值大,需要向左走,如果root值比pq小,向右遍历。前面审题不仔细没有看清楚题目要求二叉搜索树,并且也没有充分考虑各类情况。二叉搜索树相对于二叉树来说,可以利用数值大小来比较左右,只需要。二叉搜索树由于知道了左右子树的大小,用迭代法可以比较简单。总共包括五种情况,要注意使用新的结点去接住返回值的思想。参数就是根节点指针,返回值为结点,:如果结点为空,返回新的结点。如果搜索到了空结点,返回。

2024-01-03 16:28:34 365 1

原创 代码随想录算法训练营第十七天| 二叉树 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先

由于为int类型,可以设置函数类型为int(答案将其设置为void改全局变量,这里int其实也没有实际用到):当遍历到空结点返回。:和前面一样,记录前一个结点值,然后通过对比求出最小值。

2024-01-02 15:31:05 930

原创 代码随想录算法训练营第十六天| 二叉树 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索

构造树一般采用的是,因为先构造中间节点,然后递归构造左子树和右子树。类似和一样,需要从数组中提取数字构造二叉树,因此,需要分别在左右结点重新传入数组。:参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。

2024-01-02 11:00:16 982

原创 代码随想录算法训练营第十五天| 二叉树 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

因此需要本题定义一个全局参数用于记录当前的行。

2024-01-01 21:37:57 936

原创 代码随想录算法训练营第十四天| 二叉树 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

本题与二叉树的高度相关,可以使用后序遍历。:由于需要对比左右子树的高度差是否为1,对比的是高度值,因此参数为结点,返回值类型为int。如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。:当为空结点时遍历结束,返回0.确定递归逻辑:首先先遍历左子树,如果此时返回值为标记-1,没有必要继续遍历了,可以直接返回-1,然后使用if语句判断差值是否为1,如果是的话高度+1.

2023-12-29 16:18:09 321 1

原创 代码随想录算法训练营第十三天| 二叉树 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

首先区分二叉树的深度与高度前序求的就是深度,使用后序求的是高度。

2023-12-28 16:34:22 366 1

原创 代码随想录算法训练营第十二天| 二叉树 层序遍历 226.翻转二叉树 101. 对称二叉树

首先,插入根结点,然后设置循环条件(一般来说,需要借助队列/堆栈实现的循环,循环条件都会包含这些数据结构)。还有一种使用递归的方法进行翻转,需要掌握递归的方法,首先确定递归函数的参数和返回值,由题目可得参数类型以及返回值,然后确定循环终止条件,当此时结点为空时跳出当前层,然后再根据递归逻辑确立。使用层序遍历可以完成,在层序遍历中,第一次不需要将头结点放入队列中,而是可以将其子节点放入队列中,然后根据队列上面左右节点判断其是否存在,是否相同,最后再将子节点中的子结点按照对称的顺序放入队列中即可。

2023-12-27 14:51:01 1022 1

原创 代码随想录算法训练营第十一天| 二叉树 理论基础 递归遍历 迭代遍历 统一迭代

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上(最后一层),则这棵二叉树为满二叉树。对于深度为k的满二叉树,其结点有2^k-1个。

2023-12-26 15:58:49 875 1

原创 代码随想录算法训练营第十天| 栈与队列 239. 滑动窗口最大值 347.前 K 个高频元素

本题通过思考只能想到时间复杂度为O(k*n)的暴力解法,通过看完视频后,视频的思想通过构建一个只有最大值的队列用于计算,此单调队列还需要区分常见的优先级队列,常用的queue在没有指定容器的情况下,。前面卡住的如何知道什么时候弹出队列头的问题,可以通过设置pop为有参函数来实现,用pop第【i-k】的位置的值来实现。如果队列front为最左端时(即最左端为最大值时才会弹出)。

2023-12-26 10:54:26 442 1

原创 代码随想录算法训练营第九天| 栈与队列 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

对称匹配问题常常可以通过栈来解决,使用储存前面的一个数,然后遇到相同的弹出。本题会出现三种情况,第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。

2023-12-25 14:38:54 312

原创 代码随想录算法训练营第八天| 栈与队列 232.用栈实现队列 225. 用队列实现栈

队列是先进先出,栈是先进后出三个最为普遍的STL版本:HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。

2023-12-25 11:14:47 458

原创 代码随想录算法训练营第七天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串

本题使用双指针可以直接在首位操作。本题可以直接让循环中i的位置直接变成2*k,而不需要每次i++啥的。

2023-12-20 22:43:16 494 1

原创 代码随想录算法训练营第六天| 哈希表 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

看到本题想到如何使用哈希表的方法来解决,有两种计算方法,一种是求三个数组的和,然后用剩下的数的负数去使用哈希查询,但是这种方法的计算复杂度为O(n^3),还有一种就是两两求和,然后看其是否互补。

2023-12-19 16:42:56 406 1

原创 代码随想录算法训练营第五天| 哈希表 242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,哈希表的作用在查询时,枚举的时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。但是哈希法也是,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景!如果数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有重复的名字同时映射到哈希表 同一个索引下标的位置。

2023-12-18 18:41:05 971 1

原创 代码随想录算法训练营第四天| 链表 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 141. 环形链表 142.环形链表II

由前面一题可以判断出该链表是否是环形链表,由其中的图片可以看到,快慢指针相遇的地方为x+y处,由于快指针比慢指针快两倍,因此2(x+y)=x+n*(y+z),化简可得x=(n-1)(y+z)+z。然后分析题目,对于两个链表,如果有相交的部分,那么最后几个结点一定是相同的,即两个不同的链表从相交点开始到最后指向链表的空结点时,两个链表的长度应该需要相同。因此,可以先求出两个链表的长度,然后让长的链表先移动多余的长度,使得两链表从相同的长度开始比较。本题需要注意,针对链表的下一结点进行操作时,常常将链表的。

2023-12-17 19:23:54 387

原创 代码随想录算法训练营第三天| 链表 203.移除链表元素 707.设计链表 206.反转链表

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。因为链表的节点是一个地址,可以理解为cur->next=一个物理地址了,此时节点名改变的话,并不会改变next的指向。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。

2023-12-15 20:40:41 350

原创 代码随想录算法训练营第二天| 数组 977. 有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II

看到题目,想到不管n的数值为多大,都是进行4个方向加减,因此可以先设置方向0,1,2,3,设置全为-1的容器,如果后续达到了边界,且改边界已编辑了就需要改变方向。然后针对不同的方向,对ij进行加减,如果达到了边界并且未编辑,不能计数了,需要更改方向。写代码的时候考虑双指针,原先都写的是fast-slow,思考了半天一直不对,看了答案之后,想一想为什么是fast-slow+1。i++,直接使用ij进行容器运行,因为容器是需要从最后往前走的,进行else时,容器无法往前移动,因此重新定义一个tpr变量;

2023-12-14 19:01:14 443

原创 代码随想录算法训练营第一天| 数组 704. 二分查找、27. 移除元素

二分法包含了两种情况,一种是左闭右开区间,还有一种是左闭右闭区间,上面这种做法属于左闭右开区间这种情况,因为right是无法取到的,只有[left,right),所以left不可以等于right,由于是左闭右开区间,进行下一次循环时,right还是无法取到,所以right不用-1,而left需要+1。同理,可以理解左闭右闭区间的情况。

2023-12-13 14:17:24 508 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除