- 博客(419)
- 收藏
- 关注
原创 播放bilibili视频,视频正常加载,但是无法播放一直转圈。机型拯救者R9000P 2023
问题出在扬声器,当我使用笔记本自带的扬声器就不可播放。
2025-10-28 20:35:27
264
原创 claude 的命令 防止回答问题复杂
好你给我最简单的这个例子,给我讲一下做题方法,注意不要用进阶方法,比如能用最清晰的二维表格解决,就不要用进阶的一维表格解决分组背包问题。
2025-09-08 21:57:34
154
原创 有序数组,距离目标最近的k个数 二分查找
这道题的关键洞察是:最近的k个元素必然是连续的。初始: left=0, right=4, 区间=[1,2,3,4,5] (5个元素)结果: left=0, right=3, 区间=[1,2,3,4] (4个元素) ✓。| 暴力法 | O(n log n) | O(n) | ⭐ || 双指针 | O(n) | O(1) | ⭐⭐ || 二分查找 | O(log n) | O(1) | ⭐⭐⭐ |比较: |1-3|=2 vs |5-3|=2,距离相等,移除较大的5。
2025-09-05 20:15:02
740
原创 链表中点链表环的暴力法,及快慢指针在链表中的应用 - ✅ “链表中点“ - ✅ “检测环“ - ✅ “倒数第k个节点“ - ✅ “链表长度的一半“ - ✅ “判断链表奇偶“
它巧妙地将复杂的位置计算转化为简单的相对运动,既节省了空间(不需要存储额外信息),又提供了优雅的解决方案。| 方法 | 时间复杂度 | 空间复杂度 | 优缺点 || 暴力法 | O(n) | O(n) | 需要额外存储空间 || 快慢指针 | O(n) | O(1) | 不需要额外空间 || 方法 | 时间复杂度 | 空间复杂度 | 遍历次数 || 暴力法 | O(n) | O(1) | 2次 || 快慢指针 | O(n) | O(1) | 1次 |
2025-09-05 20:14:56
855
原创 考试链表必背模板
看到有序数组 → 想二分查找/对撞指针。✅ 固定长度窗口(异位词问题)中等题:15分钟(识别+修改模板)看到子串/子数组 → 想滑动窗口。✅ 两数之和(对撞指针)✅ 移除元素(快慢指针)✅ 查找区间(左右边界)模式1:快慢指针(最重要!模式2:前后指针(固定间距)模板4:删除倒数第N个节点。看到原地操作 → 想快慢指针。简单题:5分钟(直接套模板)模板6:合并两个有序链表。看到链表 → 想快慢指针。
2025-09-05 15:55:46
226
原创 删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素
双指针法的精髓是"重新定义问题":从"删除不要的元素"重新定义为"收集想要的元素"。例子: nums = [3,2,2,3], val = 3 → nums = [2,2,_,_], return 2。| 思考角度 | "删掉坏的" | "保留好的" || 时间复杂度 | O(n²) | O(n) || 空间复杂度 | O(1) | O(1) |删除后: [2, 2, _, _],长度变成2。初始: [3, 2, 2, 3], val = 3。
2025-09-05 14:57:37
826
原创 双指针模板
关键是要理解不同类型双指针的移动策略:对撞指针基于大小关系移动。● 总结:双指针主要处理有序数组、原地操作、回文判断、区间优化、链表操作这5大类问题。| 场景 | 暴力法复杂度 | 双指针复杂度 | 优势 || 两数之和 | O(n²) | O(n) | 巨大提升 || 移除元素 | O(n) | O(n) | 空间优化 || 回文判断 | O(n) | O(n) | 代码简洁 || 容器盛水 | O(n²) | O(n) | 巨大提升 |类型2:快慢指针(同向移动)
2025-09-05 14:47:21
291
原创 划动窗口+统计频次模板,做题思路,
i=3: window="bae" → 移除'c',加入'e' → window_count={'b':1,'a':1,'e':1} ≠ p_count。i=2: window="cba" → window_count={'c':1,'b':1,'a':1} = p_count ✓ 记录位置0。窗口1: "cba" → {'c':1, 'b':1, 'a':1} = p的频次 ✓ 记录位置0。窗口7: "bac" → {'b':1, 'a':1, 'c':1} = p的频次 ✓ 记录位置6。
2025-09-05 13:25:48
700
原创 统计频次的方法 数组 /哈希表 模板
比较简单:直接比较两个数组是否相等。方法1:数组统计(因为只有小写字母)- 只适用于小写字母(或已知字符集)- 扩展性好:中文、数字、符号都可以。🔧 纠正:字母频次统计的两种方法。- 空间动态:只存储出现过的字符。- 访问更快:O(1)直接索引。- 如果字符种类很多会浪费空间。- 通用性强:任何字符都能处理。- 稍微慢一点点(但可以忽略)方法2:哈希表统计(更通用)- 空间固定:总是26个位置。
2025-09-05 13:23:40
289
原创 有序数组找目标值出现得次数,左界右界背模板,不需要考虑具体的实现,记住模板的停下的指针位置就行
这一题:返回 右边界 - 左边界 + 1(即出现次数)2. 用二分查找找到最后一个target的位置(右边界)1. 用二分查找找到第一个target的位置(左边界)3. 计算出现次数:右边界 - 左边界 + 1。1. 找第一个 >= target 的位置。2. 找第一个 > target 的位置。- 上一题:返回 [左边界, 右边界]3. 两者相减就是出现次数。方法一:直接使用左右边界。方法二:更巧妙的做法。
2025-09-05 10:32:49
102
原创 chatgpt指令
我有一个类似的问题,请你:先讲一个直观但可能效率不高的方法,并说明它的缺点。再讲一个更高效的方法(例如,基于优先队列或堆),详细解释它的工作原理和优点。用一个具体的例子(例如,
2025-09-05 02:16:16
436
原创 找数第一个和最后一个出现的位置——二分查找
nums[2] = 3 ✓找到了!数组:[1, 2, 3, 3, 3, 4, 5] 要找:所有的3。nums[5] = 4 ✗太大了,最后的3肯定在左边。nums[3] = 3 ✓找到了!nums[3] = 3 ✓找到了!nums[1] = 2 ✗太小了,3肯定在右边。向右找: 范围变成[2,2]第1轮: 范围[0,6] 中间看位置3。第2轮: 范围[0,2] 中间看位置1。第3轮: 范围[2,2] 中间看位置2。第1轮: 范围[0,6] 中间看位置3。第2轮: 范围[4,6] 中间看位置5。
2025-09-05 02:14:48
324
原创 正则表达式,字符串的搜索与替换
对于常规的print("\\\\")输出只会进行一次转义,即输出结果就是 \\因为一个\\代表 \你问为什么re.search的第一个参数必须被当作正则表达式来处理,而不是和第二个参数一样被当作普通字符串。原因在于:re.search。
2025-09-04 22:02:05
380
原创 正则表达式与转义符的区别。注意输入的东西经过了一次转义,一次正则表达式。\\转义是单斜杠\\在正则表达式也是单斜杠所以\\\\经过两道门才是字符单斜杠
就像是正则表达式的“变身”按钮。按下它,特殊字符失去魔力(变成\.按下它,普通字符获得魔力(d变成\d所以,\d和\.中的斜杠作用是完全不同的。\d是创建新功能,而\.是取消旧功能。
2025-09-04 21:30:38
748
原创 正则表达式
让前面的*变得"不贪心",匹配尽可能少的字符。简单理解: 找到 [任何内容] 这样的文本!() = 把内容分组,记住匹配到的内容。📉 非贪心模式 <.*?📈 贪心模式 <.*> 的匹配过程。🔍 贪心 vs 不贪心的工作原理。\ = 让特殊字符变成普通字符。. = 可以匹配任何一个字符。这就是为什么结果会完全不同!非贪心模式:像一个理智的人。贪心模式:像一个很饿的人。🎯 回到你的代码例子。
2025-09-04 20:24:08
309
原创 分割回文串手绘图
回溯算法在解决这类问题时,正是通过这两种“回溯条件”来控制递归的。:这是一个成功的回溯,意味着我们找到一个解,然后返回去寻找其他解。for循环结束:这是一个失败的回溯(或者说是“此路不通”),意味着在当前层级没有更多可行的选择,必须返回上一层去重新选择。这两种机制共同构成了回溯算法的完整流程,确保我们能系统地、不遗漏地探索出所有可能的解决方案。
2025-09-04 00:06:29
445
原创 单位冲击响应频谱
同理频域冲击 时间域是1 不在圆点就是震荡的。如果不用冲击,那就是几乎为0的震荡了,因为能量守恒的。为了看到时间的波形,所以使用冲击。如果不用冲击,用周期序列也能看到时域波形。频谱是1 有时移的是震荡的。
2025-09-03 23:41:50
217
原创 最长的摆动子序列——很好的解释模板
这个问题的关键在于,我们不需要关心序列中间的那些点,我们只关心转折点。每次“转折”,我们都找到了一个新的摆动点,所以count加1。连续的上升或下降,我们只需要保留最开始和最末尾的点,中间的点都可以扔掉,它们不会让摆动序列更长。所以,这个问题的解法非常优雅,只需要一次遍历,就能找到答案。你觉得这个贪心策略是不是很聪明?
2025-09-03 21:19:46
907
原创 0 1背包的解释 这个代码解释风格好
动态规划就像一个“填表格”的游戏。我们不是直接寻找最终答案,而是一步一步地,有条理地解决一个个小问题,最后从小问题的答案里推导出最终的答案。我们来定义这个表格(二维数组dpdp[i][j]“只考虑前i个宝贝,在背包容量为j的情况下,能得到的最大价值。我们的最终目标,就是要填完整个表格,找到dp[3][5]的值(因为有3个宝贝,背包容量是5),这个值就是最终答案。定义:动态规划是把一个大问题拆解成互相联系的小问题,然后通过解决这些小问题,来逐步得到大问题的答案。逻辑:我们用dp[i][j]
2025-09-03 20:30:37
467
原创 动态规划问题五步法
状态就是dp数组的含义# 一维DPdp[i] = 到达位置i的xxxdp[i] = 前i个元素的xxxdp[i] = 长度为i的xxx# 二维DPdp[i][j] = 前i个物品,容量为j的xxxdp[i][j] = 到达(i,j)位置的xxx。
2025-09-03 15:19:46
219
原创 现在你问「怎么剪枝」,其实就是在 循环里面提前判断,如果后面剩下的数字不够了,就不用再递归下去了。
path 短(差很多个数)→ 上界更小,循环范围收紧,剪枝多。path 长(差很少个数)→ 上界更接近 n,循环范围放宽,剪枝少。它的作用就是:保证“至少还能凑齐 k 个数”,避免白白进入不可能成功的递归分支。要不要我帮你写个小程序,把len(path)从 0 到 k-1 的变化,以及对应的上界值打印出来,让你一步步看?
2025-09-03 15:09:17
300
原创 回溯算法,找[1,2,3]长度为2的组合
回溯(撤销是在递归函数后),所以递归回来就会撤销。有两种可能使得递归回来 1 、路径上有两个了。2、循环到位了 即 1 2 3 满了。而且在循环满了的时候其实会回溯两次。第一次是3元素加上正好凑齐条件一次回溯,第二次是因为循环到3满了,会使得1也被回溯。
2025-09-03 14:34:19
124
原创 深度优先 一直往一个方向走,可用递归或者栈实现
你说得对,英文里确实是,而中文“递归方法”只是实现手段之一,它们不是完全等价的概念,但在二叉树操作中往往相关。
2025-09-02 23:01:51
271
原创 广度优先搜索(BFS, Breadth-First Search)
按层访问:先访问根节点,然后访问它的直接子节点,再访问子节点的子节点……使用队列(FIFO):保证先入队的节点先访问。常用于:层序遍历二叉树、最短路径搜索、图的遍历等。核心思想:先访问“广度”(当前层)再访问“深度”(下一层)。
2025-09-02 22:39:48
361
原创 通用的二叉数迭代方法
前序迭代:重要在于每次出来一个节点后 要压入子节点在压入该节点再压入none。没有子系欸但就只压入自己和none。当到none出来的时候再出来一个节点放到结果中。以 1 23 45 00 为例。
2025-09-02 22:14:50
220
原创 使用栈(迭代法)遍历二叉树 前序遍历
遍历顺序栈的使用逻辑前序(根 → 左 → 右)出栈访问,先压右再压左中序(左 → 根 → 右)一路往左压栈,空了就弹出并访问,再转向右后序(左 → 右 → 根)方法 A:前序的变形(根 → 右 → 左),最后反转结果。
2025-09-02 16:53:35
607
原创 生成二叉树
这个方法利用了数组索引和二叉树节点位置的数学关系(左子节点索引为。这种方法不需要队列,代码看起来更简洁,但它只适用于。),通过递归的方式直接创建节点并连接。,那么确实可以有更简单的生成方法。,并且列表中不包含任何。
2025-09-02 14:45:59
225
原创 堆 自动放最小数字再堆顶,移除最小数
好的,我们用一个具体的例子来演示heapq的操作,让你直观地感受它是如何工作的。heapq模块在 Python 中实现了一个最小堆(Min-Heap)。:我们要将数字逐个插入到一个堆中,并观察堆的变化。
2025-09-02 13:52:26
267
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅