自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录第三十二天:122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

本题的解法比较巧妙。利润是可以分解的,例如第0天买入股票,第三天卖出,则利润为:本题只要求最大的总利润,因此不需要关注究竟第一天买入第几天卖出,只需算出每天的利润并收集正利润就行了这道题只问我们能不能到达末尾,所以同样不需要关注每次怎么跳,只要关注跳跃的覆盖范围能不能到达终点就行了。

2024-04-13 15:27:56 258

原创 代码随想录第三十一天:455.分发饼干、376. 摆动序列、53. 最大子序和

这道题要求的是最长摆动序列的子序列长度,用贪心的方法来做就是删除单调坡度上除了两端的节点,那么这个坡度就获得了两个局部峰值,整个序列就有了最多的局部峰值。上下坡中有平坡的情况,可以保留最右侧的那个,也可以保留最左侧的那个,例如保留最右边的那个,就是prediff = 0, curdiff>0(<0)不可以先遍历饼干大小,因为这样如果饼干的最大的那个比胃口的最大的小,那继续遍历的话剩下的饼干大小都更小,遍历完了也找不到结果。每次将尺寸大的饼干优先喂给胃口大的孩子,才能使得浪费是最小的。这题挺难的,细节很多。

2024-04-07 00:57:46 186

原创 代码随想录:回溯总结

终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止。终止条件:path中元素之和大于targetsum时直接返回,元素个数达到要求时,且path中元素之和等于targetsum时终止。终止条件:path中元素之和大于targetsum时直接返回,path中元素之和等于targetsum时终止。题目特征:给定的是多个独立的集合,每次从不同的集合中分别取一个数。终止条件:startIndex已经大于数组的长度了(可以不写)

2024-04-01 00:56:41 287

原创 代码随想录第二十九天:491.递增子序列、46.全排列、47.全排列 II

全排列问题中[1, 2]和[2, 1]算两个集合,因此不需要用startindex了,每次都从0开始选择没被选择的元素。所以排列问题需要一个used数组,标记已经选择的元素。这道题要求不能有相同的递增子序列,子集+去重,但是又要求是递增的子序列,所以不能对这个给定的集合进行排序,因此不能用之前题目中的去重逻辑。这题中包含重复数字,因此是去重+全排列。

2024-03-30 12:04:09 218

原创 代码随想录第二十八天:93.复原IP地址、78.子集、90.子集II

这道题和分割回文串的问题不同,限制了一共分成四个部分;虽然做了分割回文串那题,但我还是觉得这题很难。子集问题就是每个节点都要添加进结果。然后就是判断是否合法有点搞。这题是要结合子集和去重,自己过了。

2024-03-26 10:36:34 160

原创 代码随想录第二十七天:39. 组合总和、40.组合总和II、131.分割回文串

本题和上一题的区别在于,本题中candidates中元素里有重复;本题中candidates里每个元素只能用一次。同时和上一题一样结果中没有重复的。要想清楚其实startindex(下一轮递归遍历的起始位置)就是分割线,然后就是加一层回文串的判断。其实就是树枝上可以有重复元素(因为都是同一个组合里的),但是树层上不能有使用过的元素。这道题可以重复选取元素,所以在递归的时候就不需要从i+1开始了。所以引入一个used来记录每一个元素是否被用过。

2024-03-24 11:26:19 187 1

原创 代码随想录第二十五天:216.组合总和III、17.电话号码的字母组合

2.本题中不再用startindex,用index来直接表示遍历到digits中的第几个数字了,为什么不用startindex了?因为这次是在两个不同的集合中分别取数来进行组合,遍历的时候不能再从startindex开始了,而是从头开始。这题和组合问题差不多,本题中给出的集合是固定的,多了一个和的限制。1.数字与字母的映射:建立一个字母字符串的数组,下标就是对应的数字。

2024-03-22 10:03:45 245 1

原创 代码随想录第二十四天:77. 组合(加剪枝)

在集合n中至多从该起始位置:i <= n - (k - path.size()) + 1,开始遍历。如果for循环选择的起始位置后还剩下的元素比还需要的元素少了,就没有必要继续遍历了。这个地方为什么要加一其实不太明白,可以举个例子(应该是因为i也包括在内)回溯法还是有些抽象的,感觉和递归一样不能仔细想,只要做好三部曲就行了。还需要的元素个数:k-len(path)已选择的元素个数:len(path)列表中还剩下的元素个数:n-i。

2024-03-18 18:41:51 601

原创 代码随想录第二十一天:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

方法一:先进行中序遍历(因为中序遍历得到的结果经过了排序),结果放入一个数组,再求最小绝对差。情况二:节点本身为p,它有一个子孙节点q,则p本身就是最近公共祖先。情况一:一个节点左右两侧分别有p、q,则该节点为公共祖先。采用后序遍历,这样可以将左右子树的信息返回给中间节点。方法二:定义一个pre指针,一边遍历一边更新res。有点难,看了题解又恍然大悟了。

2024-03-14 11:48:38 348 1

原创 代码随想录第二十天:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

先弄懂了前一天的构造二叉树后自己做出来了。

2024-03-12 17:16:31 433 1

原创 代码随想录第十七天:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

自定义一个函数求高度,然后递归,遍历顺序选择后序遍历若子树不是平衡二叉树,那整棵树一定不是平衡二叉树,所以将这种情况下高度直接返回-1回溯不太熟悉因为还要回来走另一条岔路,所以需要回溯主要是递归还是难写啊。

2024-03-10 16:26:19 328 1

原创 代码随想录第十六天:104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

这道题和求最大深度大致类似,但是要注意如果根节点的左或右孩子为空的情况,如果直接将max改为min,这时就返回0+1=1了,所以特殊情况要单独列出来。在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。这样一来,有一些内侧的节点就不需要遍历,对于比较大的二叉树,时间复杂度就会降低。深度:某一节点到根节点的距离;

2024-03-09 19:42:12 324 1

原创 代码随想录第十四天:递归遍历、迭代遍历

中序遍历和其他两个不同,中序遍历对元素的操作和访问不同步,所以要用一个指针cur,来访问节点,而栈用来操作节点。写的时候举一个例子按顺序走一遍会好很多,但是不要想着“万一下面还有一个孩子该怎么办”,容易把自己绕进去。中序遍历和后序遍历就是把相应的节点顺序换一下就好了。感觉递归还是要多写写找感觉。用一个栈来模拟递归过程。统一迭代暂时不看了。

2024-03-09 11:59:15 325 1

原创 代码随想录第十五天:102.层序遍历、226.翻转二叉树、101.对称二叉树

定义一个compare用于比较两侧的子树,先考虑左右节点中有一个为空、左右节点都为空、左右节点都不为空但不相等的情况,剩下的就是左右节点都不为空且相等的情况,可以继续往下比较。来记录每一层的节点个数,因为一边弹出一边添加,会出现不同层的节点同时在队列中的情况,用size记录才能知道哪些元素是同一层的。目前只学习了递归的方法,写递归的时候一定要记住只考虑什么时候递归结束,和当前层的操作,不要往下想,不然会绕进去。这道题需要一个辅助的队列,同一层的元素弹出的同时将它的左右孩子都添加进队列。

2024-03-08 13:34:20 322 1

原创 代码随想录第十三天:239. 滑动窗口最大值、347.前 K 个高频元素

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。2.push():将一个元素压入队列,同时若压入元素比前面的元素都大,则将前面的元素全部弹出(没有必要再维护了),然后再压入。1.pop():弹出队列出口处的元素,即若要弹出的元素x等于队列出口处的元素,则队列弹出元素,否则不做任何操作。采用heapq模块,其中的heappop能弹出堆中最小的元素,heappush能添加元素到堆中。3.front():有了以上两个函数,就可以保证出口处为最大值,返回出口处元素即可。

2024-03-05 18:00:23 417 1

原创 代码随想录第十一天:20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

另外就是,今天才知道python除法是向下取整的,例如-1/22=-1,而题目要求向上取整,换成用python3直接int(a/b)就好了,难怪一开始在力扣上一直过不了,但是在自己的pycharm里就是好的。这题不算很难,括号是对称的,所以用栈非常合适,将括号的另一半添加进栈,后来再遇到时就弹出。当然要先考虑好会出现哪些情况,每种情况下字符串有没有遍历完,用什么条件判断。栈真的非常适合解决匹配问题!特别是对称类的,还有相邻的匹配等等。看到相邻重复项就想到栈,栈可以知道上一个遍历过的元素是什么。

2024-03-03 15:27:41 349

原创 代码随想录第十天:232.用栈实现队列、225. 用队列实现栈

刚开始写这道题的pop时,直接用了list来实现,然后直接pop(0),但是其实列表的pop(0)时间复杂度为O(n),所以用collections.deque双端队列,时间复杂度为O(1),同时要求用队列来实现栈,所以只用deque中的append和popleft;设置两个双端队列in和out,in用来存数据,out用来需要的时候备份,这题不像上一题,上一题中将数据放到另外一个栈中顺序就对了,可以直接弹出,这题两个都是先进先出,所以得将除了栈顶元素之外的其他元素先移走;要通过画图来模拟弹出的过程。

2024-03-02 17:57:13 430

原创 代码随想录第八天:344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

先要把所有多余的空格都删去,用split就可以将字符串转化为列表,列表中的元素就是所有的单词。这题写的时间有点长,因为一开始题目意思理解错了,没看到是每2k个就要反转其中的前k个,当然这题也可以初始化一个新的字符串,并将字母按正确顺序添加。注意1.字符串是不可变对象,不能直接操作,要先转为列表。利用这一特性,可以减少对剩余字符的讨论。先全部倒过来,再将其分为两部分。python中也可以这样写。

2024-02-29 18:04:27 384

原创 代码随想录第七天:454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和

才知道用双指针,由于需要去重,所以细节很多,我写的时候习惯将每一次移动画出来,这样一直顺着往下写感觉比较清楚。以后加上了剪枝操作。剪枝的时候要注意target可能为负,所以不能和上一题一样只判断nums[i]。每次考虑是不是用哈希法求解时,就要想想这题是不是或者能不能转化为判断一个数是否在集合中出现的问题。这题只需要返回元组个数,也不用去重,所以简单了不少。这题和昨天的有效的字母异位词差不多,很快就写出来了。这道题我顺着三数之和的思路也通过了,看了。

2024-02-28 14:43:33 356

原创 代码随想录第五天: 242.有效的字母异位词 ,349. 两个数组的交集,202. 快乐数,1. 两数之和

将遍历过程放入字典,将第二个元素写成target-nums[i],查找这个元素是否在字典中,也就是用哈希表的方法,不在则将元素插入字典中。一看到题目说输出结果中每个元素都是唯一的,就想到了集合,直接求交集,记得最后转成list。由于规定了数组长度小于1000,所以也可以用数组作为哈希结构。主要学习哈希表的方法,选用数组,设26个0(26个字母),这题一开始乍一看以为要用递归了,结果发现递归出口不好写。,这题写法还是挺多的,可以用哈希表。还有一个双指针的方法等有空再看。思路容易想但是时间复杂度高。

2024-02-27 08:54:54 537

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

的例子(比如索引为0,链表中只有一个元素且要被删除,链表为空,等等),来决定cur是从虚拟头节点还是虚拟头节点的下一个开始,以及while后面的内容。双指针法比较好理解也比较清晰,主要是在移动cur前,一定要先用temp来临时保存cur.next,因为马上链表就要反转,cur.next就不是往后移动一个了。,而是又定义了一个函数计算链表长度,有点绕了,先定义一个size会方便一个,就是不能忘记在添加或删除元素时让size加一或减一。这题写了很久,一开始没有用虚拟头节点噼里啪啦一通写,结果超时了,再后来用。

2024-02-25 18:39:21 352

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

看到题目最先想到直接用sort函数排序,后来意识到可以用左右指针完成,因为给定的是非递减数组,故平方后最大值不是来自原数组的最左端就是最右端。先写了两层for循环的暴力解法,果不其然超时了,后来看了解答尝试着写滑动窗口,主要难点就是变更起始位置,写的过程中也遇到了一些困难。,每次填充的数目要一样,都保持左闭右开,所以要定义一个offset边界,同时也要明确一共要循环的次数(可以自己举几个例子)。一开始看到题目不是很有思路,觉得有点乱。看完答案后,发现关键在于。第一次接触滑动窗口的题目。

2024-02-23 17:34:18 332

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

个人比较习惯用左闭右开的写法,这次看了视频以后更加理解了左闭右闭、左闭右开两种写法的原理,以前还不太理解加不加等号、要不要减一等问题,其实关键是要保持。首先要注意的是,数组的元素再内存地址中是连续的,所以不能单独删除数组中的某一个元素,第一次接触快慢指针的题目,只能勉强写一个暴力的解法,但是也遇到了不少问题。设置fast、slow两个指针,用一层循环实现两个循环的功能。fast:查找新数组中将要添加的元素(即不需要被删除的元素)也就是让要删去元素后面的元素全部前移。slow:更新新数组元素的下标。

2024-02-22 21:04:33 748

空空如也

空空如也

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

TA关注的人

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