自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第三十七天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。F(n) = F(n - 1) + F(n - 2),其中 n > 1。每次你可以爬 1 或 2 个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。都是斐波那契数的变形,简单题目,先对dp有一个认知。给定 n ,请计算 F(n)。:你将从下标为 1 的台阶开始。:你将从下标为 0 的台阶开始。:有三种方法可以爬到楼顶。

2024-10-17 10:38:20 44

原创 代码随想录算法训练营第三十六天|56. 合并区间,738. 单调递增的数字,968. 监控二叉树

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。从头遍历,遇到当前位置数字小于前一位数字时候,前一位数字减一,从当前位置到最后数字都改为9,然后从头遍历,直到满足全递增。当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增。

2024-10-16 14:35:29 224

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

在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。只需更新重叠区间,如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。例如 [1, 2] 和 [2, 3] 是不重叠的。在x = 2处发射箭,击破气球[1,2]和[2,3]。

2024-10-16 14:15:45 414

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

每个加油站的剩余量rest[i]为gas[i] - cost[i]。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。

2024-10-16 14:14:24 492

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

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。从后往前遍历,如果能从下标0跳到下标n-1位置,n-2下标能跳到n-1位置,也能从下标 0跳到下标n-2位置,问题就改为从下标0能否跳到下标n-2位置,若n-2下标不能跳到n-1位置,n-3下标能跳到n-1位置,问题就改为从下标0能否跳到下标n-3位置,以此类推。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

2024-10-12 14:48:25 481

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

在计算是否有峰值的时候,遍历下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 此时就有波动就需要统计。大饼干优先:局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩,从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。子数组是数组中的一个连续部分。

2024-10-12 10:24:22 487

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

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1:输入:nums = [4,6,7,7]输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]示例 2:输入:nums = [4,4,3,2,1]输出:[[4,4]]注意这道题数组不能排序,会破坏数组结构。有重复元素

2024-10-11 21:53:01 927

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

输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]涉及重复元素问题,在回溯前先排序,利用递归的时候下一个startIndex是i+1而不是0去重,对同一树层使用过的元素进行跳过。给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。给你一个整数数组 nums ,数组中的元素 互不相同。,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在。解集不能包含重复的子集。

2024-10-10 23:08:32 722

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

中可以使数字和为目标数$ target$ 的 所有 不同组合 ,并以列表形式返回。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。有模板后就简单了,可使用多次,无非是回溯时候从当前位置开始。中所有可以使数字和为$ target$ 的组合。中的每个数字在每个组合中只能使用 一次。7 也是一个候选, 7 = 7。

2024-10-10 23:05:24 851

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

在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。输出**:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。**输入: k = 4, n = 1。上面题目模板简单修改就行。没有其他符合的组合了。没有其他符合的组合了。: 不存在有效的组合。

2024-10-07 23:05:25 443

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

将二叉树转换有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],就是对应题目要求的,因为是二叉搜索树,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]输入:root = [3,2,4,1]输出:[3,3,2]

2024-10-07 18:09:49 443

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

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

2024-10-01 19:47:08 1054

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

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。这道题目是二叉搜索树,中序遍历就是有序的,遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即出现频率最高的元素)。:节点 5 和节点 4 的最近公共祖先是节点 5。

2024-09-28 23:52:25 302

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

合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。这道题目有个陷阱,不能单纯的比较左节点小于中间节点,右节点大于中间节点,要比较的是左子树所有节点小于中间节点,右子树所有节点大于中间节点。上面两个代码中,递归超时了,该树已经是二叉搜索树了,所以利用二分性质切分,参考答案。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。:根节点的值是 5 ,但是右子节点的值是 4。只考虑根节点值情况,直接遍历就行。

2024-09-28 22:23:41 730

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

判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

2024-09-26 22:00:03 349

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

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。总结:递归相对容易理解掌握,迭代法待后续加深学习。叶子节点 是指没有子节点的节点。

2024-09-26 20:04:44 182

原创 代码随想录算法训练营第十三天|树的遍历

递归二叉树程序代码基本相同,能写出一个稍微改改其他的也使用,这里需要注意的。非递归写法理解需要一定基础,待后续补充。

2024-09-25 09:23:51 108

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

参考方法3层次遍历和第一个方法类似,缺失值None值补充,若对称则每层对称,正反序一致。注意这里的每层判断写法,每层循环完后初始化,该方法理解稍微简单。和层序遍历不同,不涉及输出,层序遍历格式可以统一。针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。左右遍历,左子树遍历按照中左右,右子树遍历按照中右左方式,缺失值用None填充。参考方法1递归法,从理解上不如迭代法清晰,代码实现工作量没优势。参考方法2迭代法,遍历中判别,存储结构可选栈或队列。非递归写法,以非递归遍历树的模板。

2024-09-25 09:22:19 146

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

栈的简单应用,这里有个坑,在python截断除法X // Y不是真的直接去掉小数点后面的数字,而是类似模块math中的floor方法,即向下取整,且负值的取整方式也是这样的。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。

2024-09-21 22:15:34 593

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

例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

2024-09-20 22:13:01 529

原创 代码随想录算法训练营第九天|151. 反转字符串中的单词,55.右旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

参考官方方法,如果一个字符串s是由重复子串组成,那么最长相等前后缀不包含的子串一定是字符串s的最小重复子串,此为充分必要条件,证明省略。给你一个字符串 s ,请你反转字符串中 单词 的顺序。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。观察next数组,发现若字符串可由重复子串构成,最长相等前后缀不包含的子串长度是字符串s的最小重复子串,参考上面KMP算法。

2024-09-19 20:46:36 613

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

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。官方参考方法,题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

2024-09-18 15:06:01 367

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

参考力扣官方题解,统计 magazine 中每个英文字母 a 的次数 cnt[a],再遍历统计 ransomNote 中每个英文字母的次数,如果发现 ransomNote 中存在某个英文字母 c 的统计次数大于 magazine 中该字母统计次数 cnt[c],则此时我们直接返回 false。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。

2024-09-17 22:37:30 642

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

参考其他人方法,使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。这道题目和上面基本一样,不考虑顺序,采用字典可以解决,字典索引为数组元素,索引值为元素下标。分别建立字典哈希表,索引为字符当前字符,索引值为出现次数,判断两个字典是否相等。题目中字符串只有小写字符所以字符唯一,简单思路,

2024-09-16 15:23:44 757

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

假设相遇点距环的起点的距离为 m,那么结合上图的 slow 指针,环的起点距头结点 head 的距离为 k - m,也就是说如果从 head 前进 k - m 步就能到达环起点。可以看到,当快慢指针相遇时,让其中任一个指针指向头节点,然后让它俩以相同速度前进,再次相遇时所在的节点位置就是环开始的位置。参考答案使用了临时变量temp1 存储未遍历的链表,temp 存储用于交换顺序的链表节点,交换完成后,temp1放在完成排序链表后。简单思路,先遍历链表,找到链表长度后,根据条件,遍历链表跳过需要删掉的节点。

2024-09-14 23:28:45 884

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

关键在于移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。在写代码的时候也需要单独写一段逻辑来处理移除头结点的情况。参考给链表设置虚拟头节点,统一代码形式,代码参考。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。参考上面思路,添加虚拟头节点,遍历链表,next指向上一次的链表值。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

2024-09-13 15:37:56 194

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

另一种思路,考虑整个序列满足条件的话,去掉左边或者右边端点元素后,二次判断,满足条件的子序列一定在两者其一,采用归并方法直到找到无法去除端点元素的子序列。再换思路,从头遍历子序列,有发现满足条件子序列,从子序列头开始判断,去掉后是否满足,满足条件的k值添加到新列表中,最后返回列表最小值,AC通过.首先想到子数组是连续的,从头遍历,遇到满足条件,记录对应长度,然后遍历下一个字符,总耗时是。该方法会超过时间限制,循环过程中并没有利用到上一次循环的结果,存在计算浪费。除了返回的矩阵以外,空间复杂度是常数。

2024-09-12 14:43:30 698

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

第一日打开,耗时2个小时左右

2024-09-11 17:39:20 807

空空如也

空空如也

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

TA关注的人

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