自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录day34 | 62.不同路径 63.不同路径II

这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2025-01-13 23:48:45 734

原创 代码随想录day32 | 动态规划理论基础 leetcode509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

2025-01-13 09:14:29 924

原创 代码随想录day31 | leetcode 56.合并区间 738.单调自增的数字 贪心算法总结篇

贪心思路往往很巧妙,无固定套路,代码模板。

2025-01-03 00:23:33 1098

原创 代码随想录day30 | leetcode 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间

i++) {遍历字符串,通过将字符映射到edge数组的索引(例如,a对应索引 0,z对应索引 25)。将当前字符的索引i更新到edge中,确保edge存储的是每个字母的最后出现位置。

2025-01-01 21:55:15 314

原创 代码随想录day29 | leetcode 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列

咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。

2025-01-01 00:06:56 1272

原创 代码随想录day28 | leetcode 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

本题首先要清楚两点:想获得利润至少要两天为一个交易单元。这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…循环反复。如果想到其实最终利润是可以分解的,那么本题就很容易了!如何分解呢?假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第

2024-12-30 22:40:11 1569

原创 代码随想录day27 | 贪心算法理论基础 leetcode 455.分发饼干 376.摆动序列 53. 最大子序和

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。贪心算法并没有固定的套路。所以唯一的难点就是如何通过局部最优,推出整体最优。将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解贪心的本质是选择每一阶段的局部最优,从而达到全局最优。贪心算法并没有固定的套路。所以唯一的难点就是如何通过局部最优,推出整体最优。将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解。

2024-12-28 22:14:24 1326

原创 代码随想录day25 | leetcode 491.递增子序列 46.全排列 回溯总结

组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。

2024-12-25 21:20:50 959

原创 代码随想录day24 | leetcode 93.复原IP地址 90.子集 90.子集II

为了获取到最后一个元素。

2024-12-20 12:35:23 353

原创 代码随想录day23 | leetcode 39.组合总和 40.组合总和II 131.分割回文串

这一部分用于按“层”去重。如果当前元素与前一个元素相同,且前一个元素在当前层没有被使用(进行排序是为了方便去重和剪枝。排序后,相同的元素会相邻,可以通过简单的逻辑避免重复。只有当前层的数字和前一个数字相同时,才需要检查是否跳过。:将当前数字加入路径后,继续递归处理下一层。:撤销选择,包括移除路径中的数字,恢复。),就跳过这个元素,避免重复组合。

2024-12-19 23:40:10 1248

原创 代码随想录day22 | 回溯算法理论基础 leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III 17.电话号码的字母组合

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。回溯法的性能如何呢,这里要和大家说清楚了,虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。那么既然回溯法并不高效为什么还要用它呢?因为没得选,一些问题能暴力搜

2024-12-18 21:06:35 965

原创 代码随想录day21 | leetcode 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结篇

大体分分类。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,运用有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,leetcode257.找所有路径也用了前序,这是为了方便让父节点指向子节点。

2024-12-17 16:48:59 521

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

每次递归调用都会将当前函数的执行状态压入栈中,直到遇到基准条件(如当基准条件触发时,函数会开始返回值,并逐层向上传递这个返回值。每一层递归会接收到返回值,并用这个返回值来更新树的结构,接着再返回给上一层。递归的返回值通过栈的结构,逐层向上传递,最终形成正确的树结构。

2024-12-16 17:01:20 602

原创 代码随想录day18 | leetcode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先

所有递归的写法都与正常人类想法的实现顺序相反,都是先写条件成立会发生什么 再写递归成立条件通过递归调用栈实现回到上一个节点节点(恢复上一层的状态),调用栈能够记录每次递归调用的函数状态,包括函数的局部变量、参数以及函数执行到的具体位置。当递归到某个节点的左子树或右子树处理完毕后,会自动返回到上一层继续执行未完成的代码。这种机制使得代码在逻辑上看起来像「回到上一层」,而实际上是恢复了保存的调用栈状态。递归加双指针做法我的想法是对的!递归的写法和我们通常思考问题的顺序确实存在一些差异,这是因为递归是一个自顶向

2024-12-14 19:27:13 1416

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

会破坏递归逻辑,导致代码无法正确处理子区间,从而影响结果。是当前递归处理的子区间的结束位置,其值可能小于。这样,在某些情况下,循环中使用当前递归区间的边界。时,才向左子树移动,只有在。才表示找到了目标节点。),导致错误地更新了。,即使找到了目标节点。时,才向右子树移动,

2024-12-13 15:54:40 1176

原创 代码随想录day16 | leetcode 513.找树左下角的值 112.路径总和 106.从中序与后序遍历序列构造二叉树105.从前序中序遍历序列构造二叉树

记录全局结果。存储某种状态(如深度、值等)。避免重复计算。在这段代码中,maxDepth 和 value 记录了整个树的遍历结果,这是递归设计的一种经典模式。结论定义在外面可以简化参数传递,避免在每次递归中显式传递这些状态变量。成员变量的全局性可以保证递归调用之间的数据共享,逻辑清晰,代码简洁。

2024-12-12 15:53:46 945

原创 代码随想录day15 | leetcode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

回溯是一种通过递归搜索所有可能的解,并在尝试一个解之后撤销之前的选择以继续搜索其他解的算法思想。通常回溯需要显式地修改状态(如列表或路径)并在递归返回后恢复状态。本代码的实现依赖于字符串的不可变性,因此在递归中可以避免使用显式回溯来恢复路径状态。如果需要更复杂的路径状态管理(如使用列表存储路径),则必须使用回溯的思想。回溯和递归是一一对应的,有一个递归,就要有一个回溯回溯要和递归永远在一起,世界上最遥远的距离是你在花括号里,而我在花括号外!

2024-12-11 15:57:33 1512

原创 代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

前序和后序写法都可以 我用的是前序错误写法为什么 方法不起作用?Java 的参数传递机制是 按值传递,即传递的是变量的值,而不是引用本身。对于引用类型(如 ),传递的是引用的副本。因此:在递归中,是否需要 或仅仅 两种情况的区别:1. 方法:直接 在 方法中,比如 ,方法本身不需要返回任何值。因此,当递归到终止条件时,仅仅用 即可终止当前递归调用,并让控制流回到上一层。示例: 的作用:退出当前方法,没有返回值。为什么不需要 ? 因为方法的返回类型是 ,本来就不能返回值, 就足

2024-12-10 16:07:34 1456

原创 代码随想录day13 | 二叉树理论基础 leetcode144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历 102.二叉树的层序遍历

前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。构造二叉树需要特定的输入格式,例如按层级输入节点值,用特殊标记(如。这些方法可以用来实现从用户输入读取数据并传递到操作方法中。),每次完成一层节点的处理后,都会将当前层的结果列表。链表需要先根据输入构建链表结构,然后通过方法操作它。leetcode102 二叉树的层序遍历。leetcode102 二叉树的层序遍历。需要借用一个辅助数据结构即队列来实现,需要借用一个辅助数据结构即队列来实现,,后面在介绍图论的时候 还会介绍到。

2024-12-09 21:46:57 904

原创 代码随想录day11 | leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素 栈与队列总结

括号匹配是使用栈解决的经典问题。建议要写代码之前要分析好有哪几种不匹配的情况,如果不动手之前分析好,写出的代码也会有很多问题。先来分析一下 这里有三种不匹配的情况,第一种情况,字符串里左方向的括号多余了,所以不匹配。第二种情况,括号没有多余,但是括号的类型没有匹配上。第三种情况,字符串里右方向的括号多余了,所以不匹配。这里还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!

2024-12-07 15:52:42 1034

原创 代码随想录day10 | 栈与队列理论基础 leetcode 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

和只是声明了两个变量,实际的初始化发生在构造函数或后续代码中。是在声明时就初始化了变量,所以stackIn立即指向一个新的Stack对象,可以直接使用。栈为空:说明所有的左括号都找到了对应的右括号并正确匹配。这时返回true,表示字符串中的括号是有效的。栈不为空:说明仍然有没有匹配的左括号存在(有多余的左括号没有找到对应的右括号)。此时返回false,表示字符串中的括号无效。ArrayDeque更适合用于需要快速插入和删除(特别是在队列两端)的场景,且不需要频繁的中间操作。LinkedList。

2024-12-06 21:46:43 1161

原创 代码随想录day9 | leetcode151.翻转字符串里的单词 卡码网:55.右旋转字符串 暂时跳过KMP内容 字符串总结 双指针回顾

通过三个步骤(a ^= bb ^= aa ^= b),a和b的值得以交换,且不需要额外的临时变量。这就是所谓的异或交换。x ^ x = 0(任何数与自身异或得到0),x ^ 0 = x(任何数与0异或得到它本身),(异或运算具有交换性)。因此,最终交换完成后,a和b的值互换。字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。双指针法是字符串处理的常客。KMP算法是字符串查找最重要的算法,现在我没有理解代码如何实现 先放一放。

2024-12-05 19:42:20 808

原创 代码随想录day8 | leetcode344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

这行代码的目的是防止翻转区域越界,确保翻转操作的end索引不会超出字符数组的实际长度。通过Math.min,我们保证了翻转的范围始终在有效范围内。数组:是一个数据容器,可以存储同一类型的多个元素,长度是固定的,可变的。字符串:是一个特殊的对象,专门用于存储字符序列,具有丰富的操作方法,而且是不可变的。它们的共同点是都可以通过索引来访问元素,但在使用时,它们有不同的操作方式和功能。

2024-12-04 17:43:19 1126

原创 代码随想录day7 | leetcode454.四数相加II 383. 赎金信 5. 三数之和 18. 四数之和 总结

一般来说哈希表都是用来快速判断一个元素是否出现集合里。对于哈希表,要知道哈希函数和哈希碰撞在哈希表中的作用。哈希函数是把传入的key映射到符号表的索引上。哈希碰撞处理有多个key映射到相同索引上时的情景,处理碰撞的普遍方式是拉链法和线性探测法。数组set(集合)map(映射)

2024-12-03 20:51:56 1100

原创 代码随想录day6 | 哈希表理论基础 leetcode242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 (Day5周日是休息日)

而如果直接在数组中添加元素,则需要手动跟踪添加的元素数量,并确保数组的大小足够。,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。一个好的哈希函数能够有效减少冲突,提升性能。通过哈希表的特性,快速查找和存储元素,可以在一次遍历中有效地解决问题。由于数组的大小有限,不同的键可能映射到同一索引(称为。下面是一个可能的改进方式,利用。是一个大小为 26 的数组,每个元素。中该字母的出现次数之差)。是一个动态大小的容器,而。(Two Sum)的问题中,用charAt(i)

2024-12-02 21:37:15 1333

原创 代码随想录day04:链表 | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 I 链表总结

相遇点并不是环的入口,但从相遇点出发,两个指针(一个从链表头出发,一个从相遇点出发)会在环的入口处相遇。这是因为相遇点的存在意味着快指针和慢指针已经环绕过一部分链表的循环,起点之间的距离和环的结构决定了它们会在环入口相遇。

2024-11-30 22:42:22 544

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

单向链表(Singly Linked List)每个节点包含数据和指向下一个节点的引用。适合插入和删除操作,但不支持反向遍历。双向链表(Doubly Linked List)每个节点包含数据、指向下一个节点和前一个节点的引用。支持双向遍历,适合需要反向操作的场景。Java 内置LinkedList类Java 提供了内置的LinkedList类,它是双向链表的实现,操作简单且高效。链表适合用在对插入和删除操作有高要求,但访问元素不频繁的场景。

2024-11-29 23:20:54 960

原创 代码随想录day2 | leetcode209.长度最小的子数组 | 59.螺旋矩阵II | 区间和 |开发商购买土地 |数组总结

= n / 2计算矩阵的总和。计算每行和每列的和(前缀和)。通过横向和纵向切割,找到切割后的两部分总和差的绝对值最小的切割位置。最后输出最小的差值。

2024-11-28 22:02:46 805

原创 代码随想录day1| leetcode704. 二分查找,35.搜索插入位置 ,27. 移除元素,977.有序数组的平方

fastIdex是索引,用于指向数组中的位置,而是数组对应位置的具体值。代码的核心目标是处理数组的值,而不是索引,因此不能将替换成fastIdex。Java代码= val) {

2024-11-27 22:24:34 874 1

原创 代码随想录day1| leetcode704. 二分查找,35.搜索插入位置 ,27. 移除元素,977.有序数组的平方

`l++`:这是一个**后缀递增操作**,意味着首先使用当前 `l` 索引对应的值 (`nums[l]`),然后再将 `l` 的值加 1。- 将 `nums[l] * nums[l++]` 的结果(即 `nums[l]` 的平方)赋值给 `res[j]`,然后 `j` 减 1,准备将下一个值放入前一个位置。= 3` 成立,但 `nums[0]` 实际是 `3`。- `j--` 是一个**后缀递减操作**,意味着你首先使用当前 `j` 的值来访问数组 `res` 中的元素,然后将 `j` 减 1。

2024-11-27 22:20:20 374

空空如也

空空如也

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

TA关注的人

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