自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第25天|● 216.组合总和|||● 17.电话号码的字母组合

优化1:如果当前sum值已经比目标值大了就没必要再继续递归了,因为按递归规则越往下加的数越大,当前sum已经超过了目标值,后面加说明数都超过目标值。思路:这题和77题的组合思路差不多一样,只是多了一步判断加起来的和是否和目标值相等,并且回溯需要把相应的值减去。优化2:和77题的优化思路一样,i是控制起点,如果起点到终点之间的数不够k个则不需要再往下遍历。

2024-03-07 22:52:39 409

原创 代码随想录算法训练营第24天|77. 组合

剪枝优化:假如n=4,k=3。当第一个选取3的时候,当时后面仅有4可选,不满足3个数的组合条件,这种情况如上代码还会进行一步递归,所以这种情况是可以优化的。当起点选为2的时候,这是最后满足条件的起点,当在这一步的时候往后就不需要再递归遍历了。所以k-path.size()是当前还需要找几个元素,n-(k-path.size())如果为正说明后面的元素个数满足还需要找的元素个数。例如path中没有元素,size为0,则利用这个公式算出为2.指最多到2就可以停下遍历了,后面再遍历也不够元素个数。

2024-03-07 21:46:28 522

原创 代码随想录算法训练营第23天|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

思路:不能直接删除比区间小的或大的节点。例如比low小的根节点,虽然左子树都比根节点小可以全删,但是其右子树可能是存在区间内符合条件的值,所以需要在其根节点右子树继续遍历找到不符合条件的节点删除。比high大的思路和比low小的一样。

2024-02-22 18:11:57 814

原创 代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

思路:这题可以利用二叉搜索树的特性能更明确的去左右方向找pq。所以什么遍历顺序都可以。如果pq的值都小于root值,说明pq一定在左子树,去左子树遍历。如果pq的值都大于root值,则在右子树。排除以上两种情况,最后一种情况就是pq分别在root左右两侧。此时root一定是pq的最近公共祖先。因为如果往左遍历会错过右子树的节点,往右错过左。

2024-02-22 16:32:57 782 1

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

递归法:这题和98.验证二叉树思路一样,只需要把中的处理改成比较相减值。

2024-02-21 15:31:20 884

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

思路:构造二叉树一般都用前序遍历,中左右,可以优先处理构造中节点,再递归构造左右子树。题解分步:第一步.找到该数组中最大的元素,并记录其数组下标(方便分割数组),也是切割点。第二步.中,构造该最大值的节点第三步.左,把切割点(不包含切割点)左边的数组传入递归构造左子树第四步.右,切割点右边数组传入递归构造右子树最后,返回其根节点注:分割数组必须遵循循环不变量原则,下面分割区间是左边右开。

2024-02-20 16:13:25 519

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

思路(递归):题意是找树的最后一行,最左边的值,所以不一定该节点是左孩子,也有可能是右孩子。本题不需要中的处理过程,所以前中后序遍历都可以,因为只需要左右的遍历顺序即可。用一个全局变量MaxDepth记录最大的深度,depth记录当前遍历的层数(所以需要回溯过程)。因为最先递归遍历左边,所以如果当第一次最大深度出现节点,则result一定记录的是最左值,再之后遍历如果最大深度改变则记录替换之前的值。思路(迭代法):本题用层序遍历是最简单的方法,只需要每次记录每一行的第一个节点值即可.

2024-02-19 21:42:24 801 1

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

为什么很多二叉树的题目都用后序遍历?因为左右中,可以把处理该节点放到最后,例如这题,只有得出了左右子树的高度,才能知道以该节点为根的子树是否为平衡二叉树。思路:后序遍历,计算左右子树高度差,若有一颗子树不是平衡二叉树则直接返回-1(一颗子树不平衡,则整颗子树都不平衡),否则是平衡二叉树,返回左右子树最大的一个高度加上根节点的高度。

2024-02-16 14:23:53 1245 1

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

思路:二叉树求深度:从上往下遍历,前序遍历 求高度:从下往上遍历,后序遍历本题的求最大高度和最大深度都一样,高度即深度。以下用后序遍历求深度,每层递归返回左右子树最大的高度加上本身(当前根节点)的高度.

2024-02-15 15:53:01 1087 1

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

思路:利用一个辅助队列存放每一层的元素,出队的同时再把其孩子节点存入队列。队列为空则遍历结束。

2024-02-13 19:32:02 1024 1

原创 代码随想录算法训练营第14天|二叉树-递归遍历 ● 迭代遍历● 统一迭代

总结递归三部曲:1.确定递归函数的参数和返回值2.确定终止条件3.确定单层循环逻辑后中序遍历只需改变顺序。

2024-02-07 17:32:41 1207

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

解一(暴力解):假设窗口为k,数组大小为n,每次在一个窗口找最大值,遍历n-k次,则时间复杂度O(kn)优解:时间消耗大的还是在找最大值方面,定义一个单调(从大到小单调减)队列,队列里面仅维护当前窗口可能的最大值。时间复杂度O(n)单调队列遵循规则:pop():队列非空,且并且当前value值等于单调队列的队头元素,则弹出队头元素push(value):value值必须大于队尾元素,才把value加入单调队列,若不是,则一直弹出队尾元素直到队列为空或满足value大于队尾元素.再加入队列。

2024-02-07 15:35:33 1213 1

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

思路:栈的经典应用,利用栈的先进后出特性,当遇到左括号,则把相应的右括号压入栈中,遇到右括号,再把栈顶元素pop出来对比即刻.但是要分清楚3种边界情况。第一种:遍历过程中,栈中提出的右括号和当前的左括号不匹配,则错误第二种:遍历过程中,当遇到右括号,但是栈中元素是空的,则说明没有相应的左括号,错误.因为每压入栈的右括号,都是因为遍历到了左括号,可以把栈看作一个存入期望括号的栈,比如遍历了(,则把)压入栈,说明在遍历都右括号时期望括号是),所有当遍历到右括号,若栈内没有括号,肯定是没有左括号遍历到。

2024-02-04 16:07:57 1036 1

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

栈:先进后出队列:先进先出栈和队列要理解底层的容器实现,栈并不是容器,而是容器适配器。

2024-02-02 18:01:53 662

原创 代码随想录算法训练营第9天|KMP理论●28. 实现 strStr()●459.重复的子字符串

ps:kmp算法复杂,打算二刷再好好研究,28.和459.也是kmp相关题目.二刷再看

2024-02-01 15:30:23 1283 1

原创 李沫深度学习d2l报错,d2l has no attribute等错误

我自己是mac环境,用的jupyter,报错的主要原因是d2l的版本不兼容,必须要用d2l中的tourch包导入,即from d2l import torch as d2l,不能直接import d2l。之后安装d2l 0.17.5版本 命令:pip install d2l==0.17.5 --user。如果版本不对,需要卸载该版本,建议0.17.5版本,命令:pip uninstall d2l。有时候如果安装失败出现错误,可以尝试清理下pip缓冲,命令:pip cache purge。

2024-02-01 15:04:15 1714 1

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

思路:每次处理的数组可以看作区间大小为2k的子数组,则每次for前进以2k大小前进,题目虽然给了3个反转条件,可以整理下1.若有2k个字符,反转前k个 2.若剩下字符小于2k且大于等于k,则反转前k个 3.若剩下字符小于k个,反转剩下的;删除空格的另外一个解法利用erase函数删除,由于数组元素是不能删除的,只能覆盖,所以该函数时间复杂度O(n),又因为该函数外套了层for循环(需要一个一个找空格),所以整体的时间复杂度会是O(如图:例s.begin()+0,s.begin()+2。

2024-01-31 17:19:25 1670

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

思路:把四个数组分为两个一组,遍历a,b,并把a+b的值存储在map中,key记录a+b的值,value记录a+b出现的次数。若要四数相加为0,则c+d与a+b需要互为相反数,即a+b=-(c+d),然后遍历c,d并在map中查找是否有a+b = -(c+d),若有则把key为-(c+d)或a+b的value(该值出现的次数)加入计数器.时间复杂度为O(本题用map的好处是当出现索引下标值比较大时,不会像数组需要定一个很大的空间。

2024-01-30 20:04:34 2085 1

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

注:key值和value是不同的,key指下标索引,value是该索引存在的值两个表格应该熟知,对不同的情况用不同的容器可以使时间和空间复杂度得到最优。

2024-01-29 15:56:13 1603

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

思路:在要交换两个节点的前一个节点设置一个cur指针,并且设置temp1,temp2保存节点再进行互换,当只有奇数个节点则奇数节点和null无需互换;若偶数节点则两两都互换,最后返回head。细节:while中的判断不能写反,若cur->next->next!

2024-01-28 16:38:30 2097

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

本题的重点是创建一个虚拟头节点链接到表头,头节点的好处是可以让删除操作得到统一,还有一个细节是要及时处理释放节点的内存空间。另外补充C++易错点,若访问结构体成员,对象是实例可以用.(点),若对象是指针只能用->访问。

2024-01-26 18:56:07 1453 1

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

思路:序列为非递减(递增)序列,按平方值递增排序,数组两头一定是最大和第二大的。法一(暴力解):对数组遍历平方,再进行递增排序。时间复杂度最坏O(法二:可以利用双指针法,数组特性最大第二大分别在数组两头,head指数组头,tail指数组尾,两两分别比较,大的值进行平方放尾部,小的放回头部,tail指针逐步往前遍历。该法更类似于交换排序,时间复杂度O(n),空间复杂度(1)

2024-01-25 19:22:25 301

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

重点:1.查找前提是有序数组且无重复元素(否则返回数组下标会不唯一)2.主要有两种写法分别为:[left,right],[left,right),区间遵循不变量(每次搜索都必须满足区间定义)。代码:1.左闭右闭:[left,right]2.左闭右开:[left,right)注:两种写法在初始right值是不同的,具体情况具体分析。

2024-01-24 14:46:13 1300

空空如也

空空如也

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

TA关注的人

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