自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构 15 【复习】树和二叉树小结 | 图算法 | 拓扑排序 | AOE 网

解析:二叉树不是树的特殊形式(树的子节点无左右次序,二叉树的子节点有左右次序),二者是不同的数据结构。解析:度为 2 的树仅要求节点最大度为 2,但二叉树要求子节点有左右区分(即使只有一个子节点,也要明确是左 / 右孩子),二者定义不同。解析:树转二叉树的规则是 “左孩子右兄弟”,根节点无兄弟,因此其右子树必然为空。解析:A 有 3 个兄弟,则 B 的子节点数为(3+1)=4,因此 B 的度是 4。(例如:先序为 “AB”、后序为 “BA”,可对应两种不同结构的二叉树)。

2025-12-28 16:45:02 382

原创 Leetcode 89 必须拿起的最小连续卡牌数

给你一个整数数组cards,其中cards[i]表示第i张卡牌的。如果两张卡牌的值相同,则认为这一对卡牌。返回你必须拿起的最小连续卡牌数,以使在拿起的卡牌中有一对匹配的卡牌。如果无法得到一对匹配的卡牌,返回-1。4拿起卡牌 [3,4,2,3] 将会包含一对值为 3 的匹配卡牌。注意,拿起 [4,2,3,4] 也是最优方案。-1无法找出含一对匹配卡牌的一组连续卡牌。

2025-12-28 09:34:55 441

原创 数据结构 14 【复习】二叉树中序遍历 | 线索二叉树 | 树、森林、二叉树的转换 | 层次遍历二叉树

遍历完左子树后,就会回到整棵树的根节点。

2025-12-27 13:22:12 538

原创 Leetcode 88 K 和数对的最大数目

维度双指针法(排序版)哈希表法(边遍历边配对)核心思路利用排序后的有序性,通过左右指针的移动找和为 k 的数对利用哈希表记录 “等待配对” 的数值及数量,边遍历边配对代码核心步骤1. 排序数组2. 左右指针初始化3. 按和的大小移动指针1. 初始化哈希表2. 遍历元素计算 need3. 有 need 则配对,无则存入哈希表键 / 值含义无哈希表,仅依赖数组有序性key:数组数值value:该数值等待配对的数量时间复杂度O (n log n)(排序占主导)O (n)(仅遍历一次数组)

2025-12-27 11:11:49 658

原创 Leetcode 87 等价多米诺骨牌对的数量

哈希表的语法还需要学习,回头看看错题很有必要。至少在这个题目里面知道要实现一个题目抽象的思路,注意训练,复盘,目前这些题目还没有很好笑接出来哈希表的解题框架。有点难,大部分都是不求甚解,回头好好看看算法笔记。(ง •_•)ง加油!!!!加油加油加油!!!

2025-12-26 19:49:01 791

原创 Leetcode 86 【二分查找】在排序数组中查找元素的第一个和最后一个位置

一开始,看上面的题目还是懵懵懂懂,有很多语法的细节没有自己仔细注意。现在回头看,无非就是3种情况,对应上面的三种逻辑:1.查找元素2.查找左边界3.查找右边界虽然自己写还是会有点小问题,但是排查能力和自己修正的能力在不断提高,总比一开始什么也看不懂好的多。我在进步,和纵向的自己比,不要浮躁,不要焦虑,慢慢来,比较快。好巧,看了这题的初次提交时间刚好是1个月以前。1个月从完全没思路到自己能理出框架和思路,至少有深一些的理解,我在进步,不要放弃自己,加油。加油加油!

2025-12-25 21:28:31 721

原创 weather-app开发手记 04 AntDesign组件库使用解析 | 项目设计困惑

品牌定制:需要匹配公司品牌色特殊布局:超出组件库默认布局需求响应式:特殊设备适配需求Ant Design 让原本复杂的下拉选择、按钮交互、布局排列等工作变得简单,只需要关注业务逻辑,而不需要处理组件的视觉效果和交互细节。这种做法大大提升了开发效率,同时保证了用户体验的一致性。

2025-12-25 20:53:54 1108

原创 Leetcode 85 【滑动窗口(不定长)】最多 K 个重复元素的最长子数组

public://哈希表这里也可以视情况而定,改用vector数组,具体看需要存储的值//在循环外定义好(如果在循环内定义则不能正确记录),后续更新//约束条件,如果不符合了,移动滑动窗口,注意更新边界left++;//窗口元素的移除操作right++;//结果的更新,结合题目的操作return res;好啦,现在我再回头看看滑动窗口算法核心代码模板 | labuladong 的算法笔记。

2025-12-24 14:34:12 1018 1

原创 Leetcode 84 水果成篮 | 删除子数组的最大得分

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果。你想要尽可能多地收集水果。给你一个整数数组fruits,返回你可以收集的水果的数目。fruits = [3可以采摘全部 3 棵树。3可以采摘 [1,2,2] 这三棵树。如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。4可以采摘 [2,3,2,2] 这四棵树。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。,3,3,4]5。

2025-12-23 16:08:11 862

原创 React 20 useState管理组件状态 | 解构 | 将事件处理函数作为 props 传递 | 状态提升

Panel子组件:一个可切换显示 / 隐藏内容的面板,初始状态下只显示标题和 “显示” 按钮,点击按钮后会隐藏按钮并展示面板的内容。Accordion父组件:作为入口组件,渲染了标题和两个Panel面板(分别展示 “关于” 和 “词源” 的内容)。整体效果是:页面上有两个面板,每个面板初始只显示标题和按钮,点击对应按钮就能展开看到面板里的详细内容。// 1. 定义状态:isActive表示面板是否激活(展开),初始值为false(未展开)

2025-12-22 23:07:22 996

原创 weather-app开发手记 03 根据实际查询的城市动态更新

可以跟 AI 说:“我想用 Context+useReducer 做状态管理,代替现在的 WeatherStore,你能不能只给我核心的结构思路,不要写完整的 Context Provider 代码,我自己来补”。“我要先调城市搜索 API 拿 ID,再调天气 API,这个流程里需要注意哪些异步问题?能不能给我梳理下步骤,不用写完整代码”。“我写了这段代码想实现两个 API 的调用,你帮我看看哪里有问题?等你自己理清步骤,卡壳在某一步(比如 “怎么处理第一个 API 失败的情况”),再针对性问细节。

2025-12-22 19:21:04 976

原创 Leetcode 83 使数组平衡的最少移除数目中等相关标签 | 尽可能使字符串相等

原代码的核心问题是思路片面(仅考虑首尾元素的边界)和语法 / 逻辑错误(排序、越界、条件判断),无法覆盖所有平衡子数组的情况。正确的解法是先排序,再用滑动窗口找最长平衡子数组,时间复杂度为\(O(n \log n)\)(排序)+\(O(n)\)(滑动窗口),能高效处理\(10^5\)长度的数组。平衡条件的关键是用乘法判断(最大值 ≤ 最小值 × k),避免除法的精度丢失,同时用long long防止整数溢出。做不来,先放着了,不死磕了,自己慢慢想一想怎么用map维护?

2025-12-22 15:39:08 762

原创 Leetcode 82 每个字符最多出现两次的最长子字符串 | 删掉一个元素以后全为 1 的最长子数组

收缩左边界的核心目的:让滑动窗口重新回到无重复字符的状态,这是我们计算最长无重复子串长度的前提。收缩左边界的逻辑:从最左侧开始依次移出字符,直到当前重复的字符c的计数满足条件,此时窗口内不再有重复字符。右指针扩展窗口找新字符,左指针收缩窗口去重,过程中持续记录窗口的最大长度。

2025-12-21 14:20:18 808

原创 Leetcode 81 【滑动窗口(定长)】

i++ ){初次滑动窗口//把这个初始值赋值给我们的res,后续再更新i < n - k;++i){//这里就是滑动窗口进出以后的逻辑...//结合题目自己更新res ,注意条件,总之在更新滑动窗口//例如 res = max(cur , res);return res;

2025-12-20 14:09:05 869

原创 数据结构 13 图 | 哈希表 | 树

规则:左子树所有节点值 < 根节点值 < 右子树所有节点值(左右子树也需满足此规则)。二次探测法是哈希表解决冲突的一种方法:当关键字通过哈希函数得到的初始地址H0被占用时,依次尝试地址(需保证地址在哈希表区间内),直到找到空地址。B 树 “节点存数据 + 索引”,适合随机查;B + 树 “叶子存数据 + 链表”,同时支持随机查和顺序查。平衡二叉树(AVL 树)

2025-12-19 18:39:15 966

原创 Leetcode 80 统计一个数组中好对子的数目

核心变形:将原条件转化为,把问题转化为统计相同差值的元素对数。哈希表效率:使用统计差值出现次数,遍历数组的时间复杂度为O(n),能处理n=10^5的规模(避免了双重循环的O(n^2)超时问题)。溢出处理:使用long long存储反转后的数和差值,防止整数溢出导致错误。的核心含义:获取当前diff值在遍历到当前元素之前出现过的次数,这个次数就是当前元素能组成的新好对子数量。哈希表的工作流程:先通过累加对子数,再将diff的出现次数加 1,确保后续元素能统计到当前元素。关键修复点rev函数中的。

2025-12-18 14:35:15 1028

原创 Leetcode 79 最佳观光组合

每个元素只遍历一次只用了两个变量O(n)O(1)公式拆分是核心:将原得分公式拆分为,把双变量问题转化为单变量的遍历问题。贪心维护最优值:遍历j时,用best维护之前所有i < j中的最大值,这样每一步只需要 O (1) 计算,整体时间复杂度是 O (n)。遍历顺序:因为要求i < j,所以从j=1开始遍历,先计算当前j的得分,再更新best(避免 j 自己和自己配对)。

2025-12-17 20:27:06 651

原创 cpp 09 字符(char)可以直接比较 | back( ) | auto 类型推导关键字

字符(char / 单字符字符串)支持直接比较,核心是比较编码值;需注意大小写、字符与数值的区别,以及多字节字符的特殊处理。本题中就是利用vector的back()函数,快速获取第i个升序数组的最后一个元素(即该数组的最大值),相比更简洁、可读性更高,是 C++ 容器的常用便捷函数。核心结论:你理解的 “auto 自动推断 int、double 等类型,不用手动写” 是完全正确的,这是auto最核心的作用。关键注意点auto变量必须初始化,编译器需要初始化值来推导类型。auto推导的是编译时静态类型。

2025-12-16 14:27:48 808

原创 Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离

核心公式(由推导),是判断异常值的根本依据。临时修改计数count[x]--和count[x]++是处理 “下标不同” 的核心技巧,确保异常值和和s不是同一个元素。双条件验证:既要保证s是整数,也要保证s存在于数组中(移除 x 后),才是合法的异常值。核心转化:把转化为 “nums [j] 是否等于之前存储的 reverse (nums [i])”,用哈希表记录 reverse (nums [i]) 的下标 i。一次遍历:遍历过程中实时判断、计算最小距离,时间效率高。覆盖存储。

2025-12-16 14:26:18 1043

原创 Leetcode 77 数组中的最大数对和 | 统计坏数对的数目

项目 5:只有 51(次大 =-1),不计算。项目 7:17+71=88,当前 result=88。项目 4:24+42=66,比 88 小,result 还是 88。其他项目都是 - 1,不计算。最终返回 88,和示例结果一致。按 “数位最大数字” 分类,每个类别只保留最大的两个数,最后算这些数对的和的最大值。代码三步曲:算每个数字的 “数位最大数字”(确定类别);把数字加入对应类别,更新该类别的最大、次大值;遍历所有类别,计算有效数对的和的最大值。

2025-12-13 12:50:49 643

原创 weather-app开发手记 02 JSON基础 | API 调用 400 错误修复 | JWT 认证问题

它是的文本,是前后端传递数据的常用格式。

2025-12-12 20:37:10 1178

原创 Leetcode 76 必须拿起的最小连续卡牌数 | 可互换矩形的组数

LeetCode 提交的核心代码需要包裹在Solution类中,且函数名和参数要与题目给出的一致。核心逻辑依然是用哈希表记录元素最新下标,遍历过程中计算最小连续卡牌数,时间复杂度为 O (n)。代码中仅保留必要的头文件和核心逻辑,去除测试代码,符合 LeetCode 的提交规范。C++ 实现中使用作为哈希表,其查找和插入操作的平均时间复杂度为 O (1),保证整体算法效率为 O (n)。核心逻辑是记录元素最新下标并实时计算最小连续长度,这是解决该问题的关键。注意使用INT_MAX。

2025-12-12 11:27:18 940

原创 Leetcode 75 数对和 | 存在重复元素 II

C++ 实现的核心依然是排序 + 双指针,这是处理该问题的最优思路之一,兼顾效率和代码简洁性。关键要点是排序后双指针的移动逻辑,尤其是找到数对后同时移动左右指针,避免数字重复使用。代码符合 LeetCode 的提交规范,直接复制即可提交,且能通过所有测试。核心错误修正:去掉了打乱索引的排序操作,修复了内层循环的语法和逻辑错误,改用哈希集合实现 \(O(n)\) 时间复杂度的解法。滑动窗口思想:用哈希集合维护长度为k的窗口,是解决 “索引差限制的重复元素” 问题的最优思路。性能优化。

2025-12-11 18:21:05 992

原创 Canvas架构手记 08 CSS Transform | CSS 显示模型 | React.memo

React.memo是 React 提供的高阶组件(HOC),本质是浅比较的组件缓存工具它会 “记住” 组件上一次渲染的结果;当组件的props 没有发生浅变化时,直接复用上次渲染的 DOM / 虚拟 DOM,跳过重新渲染;仅当 props 发生浅变化(比如值类型改变、引用类型地址改变)时,才重新渲染组件。// 自定义比较:仅比较 angle,忽略 className/style// 带自定义比较的 memo 组件// ... 组件逻辑。

2025-12-10 20:36:34 1284 1

原创 Leetcode 74 K 和数对的最大数目

给你一个整数数组nums和一个整数k。每一步操作中,你需要从数组中选出和为k的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。2开始时 nums = [1,2,3,4]:- 移出 1 和 4 ,之后 nums = [2,3]- 移出 2 和 3 ,之后 nums = []不再有和为 5 的数对,因此最多执行 2 次操作。1开始时 nums = [3,1,3,4,3]:- 移出前两个 3 ,之后nums = [1,4,3]不再有和为 6 的数对,因此最多执行 1 次操作。

2025-12-10 13:17:35 895

原创 github pages 配置踩坑

居然配置一个pages配置了一两个小时,简直是要没耐心了,但是还是耐着性子部署成功了。background: react + vite + ts 项目不知道哪里出了问题,缓存有误。dist删了又新建删了又新建反反复复...本来打算用deploy脚本。最后也是,只不过最后是手动配置的。这里面的env什么都不会写,靠ai来写build的yml完全不靠谱。还是要自己学会看懂。心累心累,最后手动部署不知道怎么就那么顺利过了,主要是没有依赖gh-pages包?...还是问问聪明的ai,把这里不会的知识补一补吧!

2025-12-09 23:34:22 1097

原创 Leetcode 73 数位和相等数对的最大和 | 等价多米诺骨牌对的数量

分组:按数字各位和分组(哈希表);择优:每组内保留最大数字,遇到同组数字时计算和并更新最大值;结果:最终最大和即为答案,无则返回 - 1。标准化思想:把等价的对象转换成统一标识,是解决「等价匹配」问题的核心。组合数公式:n 个相同元素中选 2 个的组合数是n*(n-1)/2,这是统计数对的关键(避免双重循环遍历,时间复杂度从 O (n²) 降到 O (n))。数据结构选择哈希表:通用,适合范围不确定的场景;

2025-12-09 21:00:47 676

原创 Leetcode 72 数组列表中的最大距离

你的疑问核心答案为什么只看 arr [0]/arr [-1]?数组升序,首尾就是每个数组的最小 / 最大,不用看中间元素怎么防止越界?题目保证数组长度≥1,arr [0] 和 arr [-1] 一定存在,不会越界只记 min/max 为什么不行?可能来自同一个数组,违反 “不同数组选数” 的规则怎么处理同数组的情况?找 “排除该数组后的次小 / 次大”,再计算差值其实你一开始的思路已经对了 80%,只差最后一步 “处理同数组的异常情况”。

2025-12-08 19:42:20 822

原创 Leetcode 71 买卖股票的最佳时机 | 增量元素之间的最大差值

边界条件:数组长度≥2 才有可能有合法差值,而非≥3;逻辑顺序:先更新 “i 之前的最小值”,再计算当前数与最小值的差值,保证i<j;差值过滤:只保留 > 0 的差值,无合法差值时返回 - 1。

2025-12-07 23:40:33 1051

原创 weather-app开发手记 01 HTTP请求基础 | Axios GET 请求

原本这个概述博客已经讲得很清楚了,可以回顾一下看看实际开发的HTTP请求的应用场景。

2025-12-06 23:39:04 1236

原创 Leetcode 70 好数对的数目 | 与对应负数同时存在的最大正整数

若追求简洁:用替代;若追求效率:优先选择哈希集合解法(O (n) 时间复杂度)。

2025-12-06 18:30:00 1127

原创 Leetcode 69 正整数和负整数的最大计数

共有 3 个正整数和 3 个负整数。计数得到的最大值是 3。共有 2 个正整数和 3 个负整数。计数得到的最大值是 3。共有 4 个正整数和 0 个负整数。计数得到的最大值是 4。,返回正整数数目和负整数数目中的最大值。既不是正整数也不是负整数。这个版本直接使用 STL 的。,逻辑更清晰,效率相同。

2025-12-05 19:39:52 354

原创 算法笔记 18 二分查找

区间风格核心定义初始值循环条件核心特点闭区间[L, R]包含左、右边界L ≤ R需检查最后一个元素(L==R 时)左闭右开[L, R)包含左边界,不包含右边界L=0,R=lenL < RR 永远是 “越界 / 不检查” 的位置找第一个≥target 的位置:闭区间风格下,→,循环结束返回 L;找最后一个≤target 的位置:闭区间风格下,→,循环结束返回 R。先定区间(闭 / 左闭右开),再定规则,全程不换;闭区间:L≤R,更新 ±1,终止看 L/R;

2025-12-04 16:05:09 950

原创 Leetcode 68 搜索插入位置 | 寻找比目标字母大的最小字母

你的错误逻辑正确逻辑找到 target 时返回 mid-1找到 target 时,继续向右查找(因为需要「大于」target 的最小字符)target <letters [mid] 时,mid 是候选,需保留,right=mid(左闭右开)或不立即排除 mid循环结束直接返回 letters [0]循环结束后,先判断 left 是否越界:越界则返回 letters [0],否则返回 letters [left]初始right的取值与「越界判断」不匹配;

2025-12-04 16:02:12 1098

原创 Leetcode 67 长度为 K 子数组中的最大和 | 可获得的最大点数

初始化变量窗口状态变量(比如 count 哈希表、duplicateCount);窗口统计变量(比如 sum、maxSum);边界判断(n <k 直接返回默认值)。构建初始窗口遍历前 k 个元素,初始化状态变量和统计变量;判断初始窗口是否满足条件,更新结果。滑动窗口遍历移除左边元素:更新状态变量和统计变量;加入右边元素:更新状态变量和统计变量;判断当前窗口是否满足条件,更新结果。返回结果。你的代码:滑动窗口循环结束后,只做了一次。错误原因:滑动窗口每次移动后,都可能产生更小的。

2025-12-03 16:13:02 775

原创 cpp 08 erase函数 | 变量声明语法 | 无序容器系列(unordered)

容器类型erase支持形式迭代器失效情况时间复杂度vectorstring单个元素、区间当前及后续迭代器失效O(n)deque单个元素、区间中间删除时两端迭代器可能失效O(n)setmap单个元素、区间、按键删除仅被删除元素迭代器失效O(log n)单个元素、区间、按键删除仅被删除元素迭代器失效(哈希表)O (1) 平均适配器(栈 / 队列)不支持erase需转移到其他容器操作顺序容器删后更迭代器,关联容器按键删最方便,适配器无 erase 需中转。

2025-12-03 10:44:59 859

原创 Canvas架构手记 07 副作用与同步 | 不可变更新 | 调试与错误边界 | ESLint

在分布式系统中,“多客户端同步” 指多个客户端(比如不同用户的浏览器、不同设备)需要共享同一个 “全局状态”(比如聊天房间的消息、协作文档的内容),且任何一个客户端对状态的修改,都要同步到其他所有客户端。你提供的ChatRoom多个用户的ChatRoom组件连接到同一个聊天服务端,需要同步聊天消息、在线状态等。“状态同步契约” 是客户端与服务端(或客户端之间)约定的 “状态同步规则”你的ChatRoom组件通过useEffect。

2025-12-02 21:46:06 1431

原创 Leetcode 66 几乎唯一子数组的最大和

框架步骤本题具体执行初始化窗口数据和边界初始化countsumleft=0right=0扩展窗口(right++加入,更新countsumunique判断收缩条件窗口长度 ==k(固定长度,必须收缩以保持窗口大小)窗口内数据更新(结果)窗口稳定后,判断,更新最大和收缩窗口(left++移除nums[left],更新countsumunique循环直至数组遍历结束right < n循环结束,返回最大和这种适配方式完全遵循了滑动窗口的通用框架,只是根据 “固定窗口长度” 的题目特点,将收缩逻辑从。

2025-12-02 20:30:20 967

原创 Leetcode 65 固定长度窗口 | 中心辐射型固定窗口

窗口是 “连续固定长度” 还是 “以某个点为中心辐射”?若题目说 “长度为 k 的子数组”→ 普通固定窗口;若题目说 “半径为 k”“以每个元素为中心”→ 中心辐射型窗口。结果是 “每个窗口对应一个值” 还是 “每个索引对应一个值”?前者→普通固定窗口;后者→中心辐射型窗口。

2025-12-01 15:03:58 1035

原创 Canvas架构手记 06 状态管理 | 组件通信 | 控制反转

它是普通变量,而非 React 状态 / 上下文,不具备 “响应式更新” 和 “跨组件状态同步” 的能力。它是模块级普通变量,不受 React 管理,没有响应式更新和跨组件同步能力。将其纳入 React 状态体系(组件内状态 / 上下文 / 状态管理库),让状态更新能触发组件重渲染,确保所有使用处拿到一致的最新值。IoC 的核心是「反转依赖的创建和管理权传统开发:开发者主动创建依赖(如new A())、控制流程(如手动调用函数更新 UI);

2025-11-30 14:28:57 920

空空如也

空空如也

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

TA关注的人

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