自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录|Day34|贪心算法 part03|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

index = 0 #index是如果遇到从i=0开始,就一直能往下走,index一直未更新,最后返 回0.rest = 0 #这三个条件缺一不可,rest和totalrest是后面要rest+,必须设0。2.从右到左,比较左是否比右大。注意遍历顺序,从右到左才能利用上之前的信息,且用了max。【思路】1.从左到右,比较右是否比左大。1005.K次取反后最大化的数组和。【思考】这道题的题解要多练习。

2024-05-31 15:20:52 271

原创 代码随想录|Day42|动态规划 part07|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

if n <= 1:return ndp[0] = 0dp[1] = 1dp[2] = 2dp[0] = 0。

2024-05-26 17:58:49 418

原创 代码随想录|Day56|动态规划 part16|● 583. 两个字符串的删除操作 ● 72. 编辑距离

dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1 #与上题最大区别(因为可以用替换)583. 两个字符串的删除操作。

2024-05-26 17:50:20 486

原创 代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

else:else:

2024-05-26 17:46:10 382

原创 代码随想录|Day52|动态规划 part13|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

【思考】与下一章的两个题有相似处,都是两个数组中选重叠的部分,但此题是选连续的,所以其他的不重合的格子不更新还是0,那么就要用result来随时记录最大值。dp[i]即不加入j时,也就是上一个dp[i] 的 最长递增子序列长度,dp[i] 的 最长递增子序列长度。dp[j] + 1为加入 j 后,

2024-05-24 11:24:24 368

原创 代码随想录|Day53|动态规划 part14|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) 这句就保证了,即使不连续,也能记录下左边一格或上边一格的最大值,记录后便不需要用result去随时更新了。2. 同时,仍然要用 for i in range(1, len(nums1) + 1): 从1更新到len(nums),算dp[i][j] = dp[i - 1][j - 1] + 1。dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) 记录上或左一个的最大值。

2024-05-24 11:16:19 397

原创 代码随想录|Day45|动态规划 part07|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

min(dp[j], dp[j - i * i] + 1) dp[j]代表不加入当前物体时,背包在容量n时能装的数量,dp[j - i * i] + 1代表加入物体后,背包n装的数量。这两道题性质是一样的, 本质就是。

2024-05-23 11:52:05 268

原创 代码随想录|Day44|动态规划 part06|● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

dp[0] = 1 #初始化dp[0]为1,其他的还是0,只是为了后续推导。for j in range (1, target + 1): #背包。if j >= num: #保证背包容量比物品大。解题思路:从小背包遍历到大背包,因为这样大背包就会收到小背包的影响,会不断累加。遍历顺序:外物品内背包;背包遍历顺序:先小后大。for j in range(coin, amount + 1): #背包。遍历顺序:外背包内物品;

2024-05-22 20:00:49 399

原创 代码随想录 day29 | 动态规划 part04 | ● 01背包问题 ● 01背包问题—— 滚动数组 ● 416. 分割等和子集

取上物品nums[0]~nums[num]时,当背包容量为j时能装的价值。这里要理解:1. 背包容量取值是for j in range(target, num - 1, -1),也就是从11每次-1取到num。2.比如num = 5,dp[5],dp[6]~dp[11]的value都是5。用一维数组不断更新dp[j]( j 范围是11-num),最后如果有dp[11] = 11的时候,那么就是True了。dp[j - num] + num :不装当前物品num时,背包的价值,加上物品num本身的价值。

2024-04-11 15:51:20 222

原创 代码随想录|Day41|动态规划 part03|● 343. 整数拆分 ● 96.不同的二叉搜索树

拆分的时候,不需要 j 把 i 全部遍历一遍,如i = 5,j只要取1,2即可,即1*4,2*3,如果取3*2就重复了。dp[i]是循环到 j 时,j-1时的dp[i] 值;j * dp[ i - j ] 即分成3个及以上的数。i*(i - j) 即 分成俩数;96.不同的二叉搜索树。

2024-04-10 17:25:09 272

原创 代码随想录|Day39|动态规划 part02|● 62.不同路径 ● 63. 不同路径 II

【思考】1. 第0行和第0列都是遍历不到的,需要初始化一下 ,和上一题不同,初始化矩阵为0比较方便,因为当遇到障碍物时,当前点及后面都要为0,而没有障碍物时,只需要当前点为1,后面还是0。初始化第0行和第0列很重要。的表,注意dp[i][j - 1] + dp[i - 1][j] not dp[i][j - 1] + dp[j][i - 1]dp = [[1] * n for _ in range(m)] #如何构建一个矩阵。2. 遇到障碍物即可看作,当前点为0 就行。63. 不同路径 II。

2024-04-10 17:14:22 386

原创 代码随想录|Day38|动态规划 part01|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

【思考】 爬第i层的最少花费就是 min(爬到i-1层的花费+从i-1层爬到i层的花费,爬到i-2层的花费+从i-2层爬到i层的花费)【思考】爬第i层楼梯,其实就是前两层爬楼的方式总和相加。因为:爬到第i-1层,再爬一层就行;爬到第i-2层,再爬两层就行。746. 使用最小花费爬楼梯。【思考】注意这两个n+1。509. 斐波那契数。

2024-04-09 16:08:53 234

原创 代码随想录|Day32|贪心算法 part02|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

if i result了,说明中途遇到0,且0前面的没有能越过0走到后面的。这一句有点绕,体会。count = max(prices[i+1] - prices[i], 0) #这样写也很好。这道题没很理解本质,为什么i = =cur时,ans+1。解题思路:在每个i处看是否能到达最终点。122.买卖股票的最佳时机II。方法二:把if条件变成max。

2024-04-09 13:41:31 376

原创 代码随想录|Day31|贪心算法 part01|● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

加上index>=0不只是为了防止g或s为空,还为了防止饼干=0已经涵盖了。

2024-04-08 11:03:06 373

原创 代码随想录 | day 28 | 第七章 回溯part05 |93.复原IP地址 | 78.子集 | 90.子集II

【思考】每一条路径都被记录,不需要终止条件,简单题。【思考】本题和组合2异曲同工,用used去重。

2024-03-21 21:41:22 265

原创 代码随想录|Day27|回溯03|39.组合总和、40.组合总和II、131.分割回文串

这条剪枝使得当比如出现2+2+2+2》7时,不必再往下走到total—— path.pop()这些步骤,而是到continue,再走2+2+2+3,2+2+2+6.。if total + candidates[i] > target: #这一步剪枝很重要。if total + candidates[i] > target: #这一步剪枝很重要。【思考】如candidates= [2,3,6,7] target = 7。candidates.sort() # 需要排序。

2024-03-18 23:01:55 460

原创 代码随想录|Day25|回溯02|216.组合总和III、17.电话号码的字母组合

【思考】 剪枝这一步很重要,是一个有效剪枝,比如n=4,k=3,当进行到1+2+3=6>4时,剪枝成功,不会再继续向下进行无效递归,会直接回到上一层开始探索1+3+。if current_sum > n: #剪枝。216.组合总和III。

2024-03-18 22:53:17 449

原创 代码随想录|Day24|回溯01|77.组合

【思考】此题相当于一个回溯算法的模板,剪枝为难点,其实可理解为每次循环的有边界。相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。那么如何在这个树上遍历,然后收集到我们要的结果集呢?

2024-03-18 14:35:17 353

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

【思考】通过递归函数的返回值完成父子节点的赋值是可以带来便利的。235. 二叉搜索树的最近公共祖先。

2024-03-13 21:53:30 409

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

【思考】主要体会【中】的思路,用count记录遍历到的节点,如果值不同,则count=1,如果值相同,则+1;再引入maxcount,若count=maxcount,则result中加上cur.val,若count>maxcount, 则更新max,且用cur.val覆盖原来的result。利用了搜索二叉树的性质,按左中右这个顺序走,如果出现数值相同,只会是挨着的,不会有间隔!self.searchBST(cur.right) #右。方法一:递归——直接利用搜索树的中序递增,在树上操作。

2024-03-12 14:03:12 945

原创 代码随想录刷题day20| 654.最大二叉树 & 617.合并二叉树 & 700.二叉搜索树中的搜索 & 98.验证二叉搜索树

这是不允许空节点入递归,后面要加判断,否则像nums = [3,2,1,6,0,5],当递归到nums[0:3]的时候,是空的,所以num_max = max(nums)会报错。root.right = self.mergeTrees(root1.right, root2.right) #右。root.left = self.mergeTrees(root1.left, root2.left) #左。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。【思考】 #这一版的终止条件不要用。

2024-03-11 15:39:54 955

原创 代码随想录刷题day17|平衡二叉树&二叉树的所有路径&左叶子之和

if root.left and not root.left.left and not root.left.right: #左子树是左叶子情况。rightValue = self.sumOfLeftLeaves(root.right) # 右。leftValue = self.sumOfLeftLeaves(root.left) # 左。sum_val = leftValue + rightValue # 中。257. 二叉树的所有路径。404. 左叶子之和。

2024-03-08 23:14:15 389

原创 代码随想录算法训练营第十四天| 第六章 二叉树part03

104题 二叉树的最大深度104题 二叉树的最大深度。

2024-03-07 21:29:21 862

原创 代码随想录算法训练营第十五天 | 102层序遍历及相似十道题,226.翻转二叉树,101.对称二叉树2

if i == levelsize - 1: # 不然,如果用i ==len(que) - 1,这里的len(que)已经变了(因为已经pop了一个值),就变成i == 1-1 , 此时i = 0,符合,会添加每行第一个值(第三行也正好是两个值,所以到第三行时也会添加第一个值)只是把顺序变了,其实同145题二叉树的后序遍历一样,[::-1]一下才是后序。不能写root.left = root.right。变型2 515 在每个树行中找最大值。变型1 199题 二叉树的右视图。226题 翻转二叉树。

2024-03-06 22:19:49 362

原创 Day14|二叉树理论基础,递归遍历,迭代遍历,统一迭代

确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定单层递归的逻辑: 确定每一层递归需要处理的信息。递归方法还不是特别理解,有点晕,感觉迭代虽然绕但起码能理解。

2024-03-05 14:09:11 375

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

【思考】这道题,在代码随想录中使用的是最小堆栈,了解了这个知识点,可以从小到大排列,并像普通栈一样pop出顶端元素。self.queue.popleft()#list.pop()时间复杂度为O(n),这里需使用collections.deque()#如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。#每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。#这样就保持了队列里的数值是单调从大到小的了。

2024-03-04 16:41:30 498

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

思考:not stack的含义: 在Python中,not stack确实是用来检查stack是否为空的表达式。所以,当stack为空时(即没有元素),not stack会被解释为True。这样的设计使得代码更加简洁和易读。python2中,会直接地板除,即-1,所以要先float一下,int(float(x)/y)。3. num1,num2要用取出来pop的方法运算,不能用stack[-1],stack[-2]。思考:1. 这个方法用运算函数,实际应导入generator,再用add,sub,mul等。

2024-03-03 17:20:07 348

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

实现top()有两种方法,要么取abcde的[-1],要么也是像pop一样,先变成eabcd,用temp储存取出的popleft,返回temp,再把temp加入队列,变回abcde。用abcde自己画一下最清楚。原理就是,如果要实现pop(),首先变成eabcd,取出popleft就可以了。232题我认为看懂也理解了,但放入LeetCode就报错,不知道哪里有问题,后面再看看。栈和队列的互相实现,好绕啊,学习了deque双向队列的用法,deque就是右进左出。

2024-03-01 17:56:40 326

原创 代码随想录算法训练营第九天| 第四章 字符串part02

因为是转行过来的,且还在职,一边学python,跟着卡哥刷力扣,一边学AI知识。从睁眼就在利用一切可能的时间学习,买饭时,坐地铁时,上wc时。有时候看见群里大家的讨论,会觉得很焦虑,已经30+了,我还有能力、有运气征服下一座山峰吗?无论如何,既然决定了,开始了,就坚持走下去,焦虑也没用,尽自己最大的努力争取哪怕10%的希望。27题移除元素,第一次刷的时候还不太懂,现在觉得也不是道简单的题,要反复看。今天大概过了一遍kpm,也没很理解,打算二刷再细研究,主打一个听劝。

2024-02-29 22:34:56 394

原创 代码随想录算法训练营第八天| 字符串 part01

用range(0, len(s), 2*k),其中2k即步长。如a=[abcdefg] for i in range(0,len(a),4) , 即取出[ae]。注意:right = len(new_s) - 1 这里要用new_s,而不是s!s是字符串not列表。体会切片的方法,以及split()后,可以按单词反转而不是字符。s.strip()可以不写,split会自动去掉没用的空格。方法三:用二分法 用range。重新定义了一个函数用来反转。方法四:reversed。

2024-02-28 20:50:54 421

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

思路:四个数组,两两一组,把a+b的值和个数存入字典(即哈希表),即 counter[sum] =counter.get(sum, 0) + 1。这两句里面的right>left不可省略,不然会出现如[0,0,0]这个案例,right一直向左移,移到第一个0,后面right-=1,就会报错。只有当counter1中的键值对含在counter2里时,相减会返回{},即为False,not False为True。15和18题其实不是哈希表,是双指针,要考虑去重的细节。不是哈希表,用双指针(其实是三指针)

2024-02-27 21:47:09 1048

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

当nums = [3,3]时不成立,此时返回[0,0],nums[index(num)]即nums[index(3)]会取nums中的第一个3的索引下标。先遍历s把字符都转成数字record[ord('e')-ord('a)]+=1即在 record[4]的位置+1,#这样理解:最开始给table的键num对应的值都是0,当遇到重复出现的num时,就把它的值+1。虽然主题是哈希表,但它只是一个概念,具体是用列表(数组),字典,或集合来实现的。这里如果用集合,del table[num]可以不用,它是为了。

2024-02-26 22:27:08 344

原创 第四天|24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 , 142.环形链表II

这题的思路是:先设置一个虚拟头,节点1和2,然后dummyhead,使pre=dummyhead,pre->node2, node1->node3, node2->node1。这个思路也很迷,想不到,可以记住。1. fast每次走两步,slow每次走一步,当二者指针相同时,则证明闭环。2. 都每次移动一步,当二者相遇时,即为相遇节点。这倒题要注意最开始双指针都指到dummyhead,而不是head,不然当删除第一个元素时会报错~这里注意add是set中的方法,append是list中的方法。

2024-02-24 22:46:47 363

原创 代码随想录|203. 移除链表元素 206.反转链表 707. 设计链表

这里dummy_head = ListNode(next = head)等同于 dummy_head = ListNode(-1), dummy_head.next = head.要理解其中val和next定义,val是节点中的值,next是指向下一个节点的指针。707题设计链表:此题有点长,但值得一练,是一道综合链表题。方法二:递归法(要好好体会)方法一:双指针(易理解)第206题 反转链表。

2024-02-23 20:42:55 458

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

今天这三道题涉及指针、排序,滑动窗口,59题很有趣。也复习了python的一些用法,比如for i in range(len(nums), -1, -1),可以逆着取值,同时要注意中间值应为-1而不是0。第59题很绕,看了俩小时,思路上关键是当sum>=target时,left+1,它的算法还要再复习。

2024-02-22 21:35:02 320

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

704题,mid = (right - left) // 2 + left,其中+left很多评论中刷友不太懂,其实他是为了在nums[mid]<target 时用的,比如6个数,mid1=(5-0) //2=2, mid2=(5-3) // 2+3=4。个人觉得用左闭右闭容易思考。第一天刷题,总觉得这两道题,用python,一个命令就能写出来,删除pop不就得了。现在理解了数组元素地址连续,只能替换覆盖不能简单删除。在idea上安装了一个leetcode插件,方便刷题,debug和做笔记,愉快!

2024-02-21 23:07:30 339

空空如也

空空如也

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

TA关注的人

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