自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第三十五天|452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

而这个射箭点,初始默认为第一个气球和第二个气球的重叠部分的最右端(只要有重叠,重叠部分最左端一定是下一个气球的左端),但此时箭未射出,锁定瞄准点,同时忽略后一个气球超出重叠的部分(因为这部分不影响结果),所以将后一个气球的有边界更新为重叠部分最右端;intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) # 更新重叠区间的右边界。if intervals[i][0] < intervals[i - 1][1]: # 存在重叠区间。

2024-10-15 21:09:17 251

原创 代码随想录算法训练营第三十四天|134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。

2024-10-14 20:56:11 455

原创 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机 II 55. 跳跃游戏 45.跳跃游戏 II 1005.K次取反后最大化的数组和

如果是奇数,被翻转为负数的数也是绝对值最小的数)dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]) #注意这里是和121. 买卖股票的最佳时机唯一不同的地方。result[i + j] = min(result[i + j], result[i] + 1) # 更新到达下一跳位置的最少步数。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。

2024-10-12 21:11:07 756

原创 代码随想录算法训练营第三十一天|455.分发饼干 376. 摆动序列 53. 最大子序和

核心思路是,将小孩胃口和饼干从小到大排序,然后将最小的饼干开始尝试分给小朋友,记录小朋友胃口被满足的下标,如果饼干大于等于胃口则下标右移,继续遍历饼干,如果小于胃口无法满足,则下标不变,继续遍历寻找当前饼干值直到可以满足【未被满足胃口的最小胃口小朋友】。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

2024-10-11 21:39:59 828

原创 代码随想录算法训练营第三十天|491.递增子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独

输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出: [[1,1,2], [1,2,1], [2,1,1]]给定一个 没有重复 数字的序列,返回其所有可能的全排列。

2024-10-10 21:33:43 1063

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

本题和其他字符串切割的题目类似,只是在切割点处应该用“.”连接起来得到一个IP地址,需要注意的是每个分割后的字段转换为数字后应该保持在0-255的范围内,此处注意点也是可以作为剪枝的方向。与上一题相比,多了一个去重步骤,和昨天的题目类似,在开始一个for循环的时候,判断遍历的元素是否与for循环中前一个元素相同,如果相同,说明此时在相同位置出现了同样的元素,所得到的结果必然也是相同的,所以此时应该忽略,寻找下一个不相同的元素。给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

2024-10-09 22:09:34 655

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

由于元素互不重复,而且都是正整数,说明不需要考虑负数和零的情况(难度大大减低),首先将数组排序成递增数组,由于可以重复使用元素,所以每次递归都从上一次遍历的元素开始遍历递归,不从数组头部的元素开始而从上一次遍历的元素开始的原因是,在第一次遍历的时候已经遍历完了需要取用【最开始的元素】的所有情况,所以如果从最开始的元素开始,只会重复,之后遍历过的元素也是同理。选取切割的位置是由for来挨个尝试的,而实际进行切割的操作是由调用函数实现的,当切割的位置是字符串的末尾,说明切割的所有都正确,此时压入结果数组。

2024-10-08 16:20:12 762

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

第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]可以看出这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。代码实现如下:(未剪枝)

2024-10-07 11:26:13 1123

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

可以发现,如果将该二叉搜索树转化为有序的递减序列,累加树的每个节点值在递减序列中可以表现为:本节点的【累加值】=前一个节点【累加值】+本节点【val值】。这也是从累加树的定义中可以得到的,对于最大的节点,大于等于他的节点只有他自己。而在递归过程中,如果遇到根节点在区间内,孩子节点不在区间内,和以上相同的道理,左孩子节点如果不在区间,左孩子的左孩子必然不在区间内,所以只需要考虑【左孩子】的【右孩子】,反之,如果右孩子不在区间内,只需要考虑【右孩子】的【左孩子】。节点的右子树仅包含键 大于 节点键的节点。

2024-10-07 11:20:28 945

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

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。使用二叉搜索树的特性,搜索该节点应该在的位置(事实上搜索树中没有这个节点),在遍历到叶子节点后,直接将插入节点插入在该叶子节点下作为新的叶子节点即可。

2024-10-04 13:46:45 669

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

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

2024-09-29 20:00:43 1017

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

否则为两个节点值之和,同时合并后的节点的孩子,是继续对两棵树对应位置的节点的递归调用得到的节点。需要考虑传入节点是否存在一个空值的情况,为了取得对应位置的节点,即本过程对应位置的左右孩子,若判断到其中一个节点为空值,为其赋值一个默认节点(属性为默认空值)。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。返回以该节点为根的子树。# 但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None.

2024-09-28 21:52:02 764

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

中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。首先后序数组的最后一个元素指定不能要了,这是切割点 也是 当前二叉树中间节点的元素,已经用了。后序数组没有明确的切割元素来进行左右切割,不像中序数组有明确的切割点,切割点左右分开就可以了。切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。

2024-09-26 22:22:23 867

原创 代码随想录算法训练营第十五天|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

if root.left and not root.left.left and not root.left.right: # 左子树是左叶子的情况。st.append(node.left) # 左(空节点不入栈)st.append(node.right) # 右(空节点不入栈)leftNum = self.getNodesNum(cur.left) #左。path.append(cur.val) # 中。

2024-09-25 22:48:10 392

原创 代码随想录算法训练营第十四天|递归 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

(但规范写法的思路是当节点为空的时候return,我想这是因为如果只有一个左(右)孩子的时候依然会调用函数,这个时候有一个孩子节点是为空的,所以此时在定义递归函数的时候肯定还是需要定义一个条件:当节点为空时return,自然就不需要我一开始设置的这个条件了)递归思路:与前面计算最大深度相似,但是需要注意的是,有一种情况不一样,也就是只有一个孩子的情况,因为没有孩子的情况有可能会返回0,但此时本节点并非叶子节点,此时如果空节点返回了深度0,那么此时计算到的最小深度是错误的。

2024-09-24 21:45:09 991

原创 代码随想录算法训练营第十三天|二叉树的递归遍历 二叉树的迭代遍历 二叉树的统一迭代法 二叉树的层序遍历

思路依然还是和前面一样层序遍历,但需要注意的是本题并非要我们返回一个新数组,而是在原二叉树上,将每一个节点的next值填充,我们只需要在前面题目的基础上,在遍历每个节点的时候,判断队列内是否存在值,如果存在值说明同层内。思路依然还是和前面一样层序遍历,但需要注意的是本题并非要我们返回一个新数组,而是在原二叉树上,将每一个节点的next值填充,我们只需要在前面题目的基础上,在遍历每个节点的时候,判断队列内是否存在值,如果存在值说明同层内。切忌死记硬背本末倒置!

2024-09-23 23:42:41 1148

原创 代码随想录算法训练营第十一天|150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

在窗口进行滑动的时候,判断离开窗口的元素是否在单调队列中,如果在则将其在队列中弹出,否则不关注离开窗口的元素。然后判断进入窗口的新元素是否会成为窗口中的最大值,此时在队列中的元素一定是窗口内的元素,但是窗口内的元素不一定都在队列中,只有窗口内的最大值或者依次递减下来的其他元素(有没有其他元素取决于这些第二大的元素是否在最大值之后,满足递减队列的要求),所以新进入的元素就需要与队列中最小的元素开始依次比较,直到找到自己在队列中的 位置,但如果遇到比本元素小的元素需要将其剔除队列中。整数除法只保留整数部分。

2024-09-22 14:45:30 1295

原创 代码随想录算法训练营第十天|232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

正确思路:由于我在以上的push实现中,已经使得进入【原本栈】的元素位于【栈的底部】,这个行为已经是【队列】希望的特性,因为此时令【原本栈】进行栈的pop()操作,返回的是最先进入【原本栈】的元素,返回最先进入的元素这个行为就是队列的特性,如果我在此时又再返回当前【原本栈】的底部元素,那么此时我进行了两次反序,等同于未作反序操作,还是正序输出,所以才会出现错误。多次将一个栈中的所有元素移动到另一个栈中。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2024-09-20 21:03:41 1118

原创 代码随想录算法训练营第九天|151.翻转字符串里的单词 右旋字符串 28. 实现 strStr()

否则不相等匹配失败,就应该尝试再与匹配位置所指向的位置(匹配位置在前缀表里的数值)再次进行匹配,如果还是失败就继续以上过程,直到匹配成功或者完全不匹配(归零)。初始思路大致是先去除多余的空格,然后遍历字符串,当遇到空格的时候,对单词进行记录,添加到新字符串的尾部。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。

2024-09-19 21:35:46 933

原创 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 替换数字

而在C++等可以直接对str进行修改的语言里,可以先遍历字符串统计数字的个数,然后再根据需要扩容原字符串,需要注意的是,在这个情况下,要进行替换操作一定应该倒序操作,因为只有倒序操作复杂度才是O(n),如果正序操作的话需要额外遍历将索引后面的字符串后移,导致复杂度增加变成O(n²)。如果你确实需要修改字符串中的字符,并且想要原地修改(in-place),你需要将字符串转换为列表(因为列表是可变的),修改列表,然后再将列表转换回字符串。是一个列表,列表是可变的,所以你可以更改列表中的元素。

2024-09-18 18:46:55 966

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

另外还需要考虑去重的情况,由于i在进行遍历的时候,下一次i遍历到的可能与上一次相等,这样的话会导致三元组的第一个元素和上一次的情况重复,得出的结果会是一样的,需要注意,这里的判断条件应该是i和i-1进行比较,而不是i+1和i比较,否则i和后面的元素比较去重的话,得出的结果是不会出现相同元素的,因为在排序后的数组中,这样i一定是从重复元素之中的最后一个开始的。例如{-1, -1 ,2} 这组数据,当遍历到第一个-1 的时候,判断 下一个也是-1,那这组数据就pass了。说到去重,其实主要考虑三个数的去重。

2024-09-17 14:29:06 1131

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

思路很明确,只是不熟悉python提供的几个集合类用法,具体思路就是判断数组2里的数字是否在数组1中出现过,如果出现过就存储在result数组中,同时确保相同数字在result数组中只出现一次,如果判断在result数组中已有,则不存入。思路首先想到哈希,对应字母出现一次,则对应的哈希表位置+=1,由于本次题目限制在了小写字母,所以取值范围就是1-26,范围确定可以使用数组,如果不确定数的范围,无法使用数组,而是需要使用set,本题使用数组。它是一个集合,元素的数目由字典的值给出。

2024-09-16 17:12:51 1065

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

由于有前面快慢指针的提示,这一题的思路也就呼之欲出了,主要思路就是让长的链表和短的链表【作差】,作差的目的是算出长短链表之间的差,令在长链表的指针先走这个差值的距离,在短链表的指针从头开始出发,这样就能确保两者与交点的距离是相等的,只要两指针同速度往前平移,当指针相等时即在交点上。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。

2024-09-14 22:59:20 1127

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

链表一直是处理的不太好的数据结构,太久没处理过,第一次做链表题容易直接定义一个临时的cur节点变量等于需要判断的节点,由于是在单向链表的场景下,如果判断出该节点需要被删除,那么我们无法对上一个节点进行操作(需要让【该删除的节点】的上一个节点指向【该删除的节点】的下一个节点),这样就无法继续了。是一个哑节点(也称为哨兵节点),它不是链表的一部分,但是作为链表的头部,使得我们可以统一处理头部和中间节点的添加和删除操作。由于正常的思路过于好想,新建一个链表的思路肯定不是所考察的内容,所以第一时间也懒得去实现了。

2024-09-13 21:15:43 979

原创 代码随想录算法训练营二天|209. 长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地

太久没做题初始思路只能想到暴力破解,看了一眼提示可能会用到前缀和,能够想到只要建立一个新数组,bi = a0 + a1 + ... + ai 即数组a的前缀,这样子序列i到j就可以表示为bj - bi-1 ,由于数组元素是大于1的,所以b数组必然是递增的,那么在计算子序列的时候,当符合条件的子序列出现后记录下来,接着就可以先向右移动后下标,移动后不满足条件后,再移动左下标,直到满足条件,如此往复。第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。

2024-09-12 21:25:52 847

原创 代码随想录算法训练营第一天|704二分查找 27移除数组 977.有序数组的平方

middle作为分隔符,如果命中则直接返回,否则对middle分隔开的两边区间继续进行二分查找(由于middle此时未命中,肯定不在区间内,所以作为right的时候可以直接取值,作为left的时候需要令left=middle+1。- `left` 和 `right` 是表示当前搜索范围的两个索引,其中 `left` 是当前搜索范围的起始索引,`right` 是结束索引。后查看解析,方法是对的,但自己琢磨的不够规范化,可读性也不够,重新整理一遍。快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组。

2024-09-11 20:41:07 1126

空空如也

空空如也

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

TA关注的人

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