- 博客(204)
- 收藏
- 关注
原创 【简单】力扣算法解析191:位1的个数
本文介绍计算整数二进制中1的个数(汉明重量)的高效解法。核心使用Brian Kernighan算法,通过n= (n - 1)逐次消除最低位1,时间复杂度O(k)(k为1的个数)。对于多次调用场景,提出查表法优化:预计算0-255的汉明重量表,将32位数分为4个8位段查表求和,实现O(1)时间复杂度。代码提供Java实现,并通过示例演示运算过程。进阶方法显著提升重复计算性能,空间仅需256字节。 关键词:汉明重量、位运算、Brian Kernighan算法、查表法、位操作优化
2025-07-30 07:00:00
294
原创 【中等】力扣算法解析192:统计词频
Bash脚本统计单词频率:通过管道将文本分割为单词行,排序后使用uniq统计词频,再按频率降序排序并调整输出格式。核心命令:tr -s ' ' '\n' | sort | uniq -c | sort -nr | awk '{print $2,$1}',高效处理流数据,输出单词及其出现次数。
2025-07-30 07:00:00
64
原创 【中等】力扣算法解析176:第二高的薪水
这篇文章介绍了如何查询Employee表中第二高的不同薪水值。作者通过DISTINCT去重、DESC降序排序和LIMIT OFFSET定位,高效获取第二高薪水记录。当表中记录不足时,子查询自动返回NULL。解决方案时间复杂度为O(n),空间复杂度O(1),并附有代码实现和执行截图。文章最后提供联系方式获取完整Java代码,适合数据库查询优化学习者参考。
2025-07-29 07:00:00
219
原创 【中等】力扣算法解析177:第N高的薪水
该题目要求查询Employee表中第n高的不同工资,若不足n个则返回null。解题关键在于去重、降序排序和分页查询:使用DISTINCT去重,ORDER BY salary DESC排序,LIMIT 1 OFFSET N-1获取第n高记录。MySQL函数实现中,先计算偏移量N-1,再执行查询。若无结果自动返回NULL。性能优化建议在salary列建索引。边界情况已处理,如n=2时表只有一条记录返回null。代码简洁高效,时间复杂度取决于排序算法(通常O(n log n))。
2025-07-29 07:00:00
471
原创 【中等】力扣算法解析178:分数排名
使用DENSE_RANK()窗口函数计算分数排名。相同分数获得相同排名,后续排名连续无空缺。按分数降序输出结果,包含score和rank两列。该方案高效,仅需单次全表扫描即可完成计算。示例输出格式展示了对相同分数和连续排名的正确处理方式。
2025-07-29 07:00:00
206
原创 【中等】力扣算法解析179:最大数
题目要求将非负整数数组重新排列,组成最大的整数。核心思路是自定义排序规则:比较两数拼接后的字典序(如比较"3"和"30"时计算"330"与"303"),按降序排列。需处理全零情况(直接返回"0")。Java实现先将数组转为字符串,用自定义比较器排序后拼接。时间复杂度为排序的O(n log n),空间复杂度O(n)。代码通过StringBuilder优化拼接效率,并提前检查前导零。
2025-07-29 07:00:00
221
原创 【中等】力扣算法解析180:连续出现的数字
本文解决如何从数据库表中找出连续出现至少三次的数字。通过使用窗口函数LEAD(),按id排序后比较当前数字与其后两个数字,筛选出连续三次相同的记录。该方法只需一次表扫描,时间复杂度为O(n log n),空间复杂度O(n)。最终用DISTINCT去重返回结果。示例代码为MySQL实现,逻辑清晰高效。
2025-07-29 07:00:00
249
原创 【简单】力扣算法解析181:超过经理收入的员工
题目要求从Employee表中找出工资高于其经理的员工。通过自连接表(员工表e1和经理表e2),关联条件为e1.managerId = e2.id,筛选条件为e1.salary > e2.salary,最终返回员工姓名列(Employee)。示例中Joe的工资(70000)高于其经理Sam的工资(60000),因此是唯一符合条件的员工。该解法使用一次自连接实现高效查询,时间复杂度为O(n)。
2025-07-29 07:00:00
207
原创 【简单】力扣算法解析182:查找重复的电子邮箱
本题要求找出所有重复的电子邮件。通过GROUP BY按email分组,配合HAVING COUNT(1)>1筛选出现次数超过1次的邮件。使用COUNT(1)比COUNT(*)或COUNT(id)更高效,减少解析开销。解决方案简洁高效,直接返回重复的email列。示例中a@b.com因出现两次被正确筛选。该解法时间复杂度O(n),空间复杂度O(n),适合大数据量场景。
2025-07-29 07:00:00
193
原创 【简单】力扣算法解析183:从不订购的客户
本文介绍了如何找出从未下单的客户。给定客户表和订单表,通过左连接(LEFT JOIN)和IS NULL条件筛选出客户表中存在但订单表中无关联记录的客户。推荐使用左连接方法,因其效率更高,利用索引优化查询性能。代码示例展示了MySQL实现,确保结果列名为Customers。该方法通过单次遍历和索引匹配,高效完成过滤,适合大数据量场景。
2025-07-29 07:00:00
1202
原创 【中等】力扣算法解析184:部门工资最高的员工
题目要求查询每个部门薪资最高的员工(允许多个并列)。通过分组聚合获取部门最高薪资,再连接匹配员工记录,最后关联部门表获取名称。核心SQL逻辑: 子查询按departmentId分组计算MAX(salary); 连接员工表筛选薪资等于部门最高值的记录; 关联部门表输出名称。优化点在于避免窗口函数,直接通过分组+连接高效实现。示例中IT部门90000薪资的Jim和Max、Sales部门80000的Henry被正确选出。代码使用MySQL实现,时间复杂度O(n),适合大数据量。
2025-07-29 07:00:00
395
原创 【困难】力扣算法解析185:部门工资前三高的所有员工
本文介绍了如何通过SQL查询找出每个部门工资前三高的员工。使用窗口函数DENSE_RANK()按部门分组计算工资排名,处理并列情况并保持连续排名。通过子查询先计算排名再连接部门表,优化查询性能。最终代码筛选排名≤3的记录,返回部门名、员工名和工资。文章包含示例数据、解题思路、MySQL实现代码和优化建议,适合需要解决类似排名问题的SQL学习者参考。
2025-07-29 07:00:00
280
原创 【中等】力扣算法解析186:反转字符串中的单词 II
本文提出了一种原地反转字符数组中单词顺序的算法。核心思路是采用两次翻转法:先翻转每个单词内部字符顺序,再翻转整个数组。该方法能在O(n)时间复杂度和O(1)空间复杂度下完成任务。算法实现时使用双指针标记单词边界,通过交换字符实现原地翻转。示例代码展示了具体实现过程,并解释了关键步骤的原理。这种解法避免了额外空间分配,完全在原数组上操作,适用于大规模输入。
2025-07-29 07:00:00
156
原创 【中等】力扣算法解析187:重复的DNA序列
本文介绍了如何高效查找DNA序列中重复出现的长度为10的子串。通过将子串编码为20位整数(每个核苷酸用2位表示),结合滑动窗口和哈希集合,优化了时间和空间复杂度。具体步骤如下:1) 边界处理字符串长度;2) 初始化第一个窗口的整数编码;3) 滑动窗口更新编码并检测重复;4) 将重复编码解码为字符串输出。该方法避免了直接字符串比较,显著提升性能。代码实现包括字符映射、整数解码和集合去重等关键步骤。最终时间复杂度为O(n),空间复杂度为O(n),适用于大规模数据。
2025-07-29 07:00:00
276
原创 【困难】力扣算法解析188:买卖股票的最佳时机IV
本文解决股票交易问题,要求在最多完成 k 笔交易的情况下获取最大利润。关键思路是利用贪心算法优化(当 k 较大时)和动态规划(当 k 较小时)。动态规划通过状态转移方程分别计算持有和不持有股票时的最大利润,并用滚动数组优化空间复杂度至 (O(k))。最终时间复杂度为 (O(n \times k)),适用于实际场景。代码提供了Java实现,并通过示例验证了正确性。
2025-07-29 07:00:00
498
原创 【中等】力扣算法解析189:轮转数组
本文介绍了一种原地旋转数组的高效算法。通过三次反转操作实现数组向右轮转k个位置,避免了额外空间的使用。具体步骤为:1)整体反转数组;2)反转前k个元素;3)反转剩余元素。算法时间复杂度O(n),空间复杂度O(1),适用于大规模数据。文章提供了Java实现代码,并解释了处理k值有效性的方法。该解法通过了LeetCode测试用例,执行效率优异。
2025-07-29 07:00:00
317
原创 【简单】力扣算法解析190:颠倒二进制
题目要求颠倒32位无符号整数的二进制位(如第0位变第31位)。核心解法通过循环32次,每次将结果左移1位并取输入数的最低位,最后组合成颠倒后的整数。优化方案采用查表法,预计算字节颠倒结果,将32次操作缩减为4次查表+位移,适合多次调用场景。Java实现通过位操作(<<、>>>、&)高效完成,确保正确处理负数(无符号右移)。
2025-07-29 07:00:00
1089
原创 【中等】力扣算法解析162:寻找峰值
这篇题解介绍了如何在整数数组中寻找峰值元素的问题。给定一个整数数组,找到任意一个峰值元素(严格大于相邻元素)的索引。要求时间复杂度为O(log n)。 解题思路:使用二分查找算法,通过比较中间元素与其右侧元素的值来决定搜索方向。若中间元素小于右侧元素,说明峰值在右侧;否则可能在左侧或当前元素即为峰值。 关键步骤: 初始化左右指针 循环比较中间元素与右侧元素 根据比较结果缩小搜索范围 当左右指针相遇时即为峰值索引 实
2025-07-28 07:00:00
238
原创 【中等】力扣算法解析164:最大间距
题目要求在O(n)时间与空间内计算排序后数组相邻元素的最大差值。通过桶排序思想实现: 处理特殊情况(长度<2或元素全相同); 计算最小/最大值,确定桶大小(向上取整)和桶数量; 将元素分配到桶中,记录每个桶的最小/最大值; 遍历桶,计算相邻非空桶的差值(当前桶最小值与前桶最大值之差),更新最大值。 该方法确保最大差值只出现在桶间,满足线性复杂度。Java实现通过预处理和桶优化,高效解决问题。 关键词: 桶排序、线性时间复杂度、最大间距、数组处理、算法优化
2025-07-28 07:00:00
456
原创 【中等】力扣算法解析165:比较版本号
本文介绍了比较两个版本号字符串的方法。版本号由被点分隔的修订号组成,比较时需从左到右逐段对比,忽略前导零,缺失部分视为0。关键优化是使用双指针遍历字符串,避免分割操作,直接提取整数比较。算法时间复杂度为O(n+m),空间复杂度O(1)。代码通过双指针同步遍历,动态处理长度差异,高效完成比较。适用于处理有效版本号字符串,满足所有修订号在32位整数范围内的场景。
2025-07-28 07:00:00
779
原创 【中等】力扣算法解析166:分数到小数
给定分数的分子和分母,将其转换为字符串形式的小数。若小数部分循环,用括号标出循环节。例如,4/333 返回 "0.(012)"。算法通过处理符号、整数部分和余数来构建结果,使用哈希表检测循环节。Java实现中,通过StringBuilder高效拼接字符串,处理长整型避免溢出。时间复杂度O(n),空间复杂度O(n),适用于大数运算。测试用例验证了算法的正确性和鲁棒性。
2025-07-28 07:00:00
199
原创 【中等】力扣算法解析167:两数之和 II-输入有序数组
题目要求在非递减排序数组中找到两数之和等于目标值,并返回其下标(从1开始)。利用双指针技巧,初始化左指针在数组头部,右指针在尾部,通过比较当前和与目标值的差异动态移动指针:若和小则右移左指针,和大则左移右指针。时间复杂度O(n),空间复杂度O(1)。示例:输入[2,7,11,15]和9,输出[1,2]。代码高效且满足常量空间要求。
2025-07-28 07:00:00
670
原创 【简单】力扣算法解析168:Excel表列名称
题目要求将给定的整数转换为Excel表格中的列名称。其核心在于处理1-26的映射关系(A-Z),与常规进制转换不同。解题思路是通过每次循环前减1调整数值范围,再取余得到当前字符,最后反转字符串得到结果。Java实现中,使用StringBuilder构建字符串,通过循环处理每位字符,最终反转输出。该算法高效且直观,适合处理大整数转换。
2025-07-28 07:00:00
207
原创 【简单】力扣算法解析169:多数元素
本文介绍了一种高效求解多数元素问题的算法——摩尔投票法。该算法通过抵消不同元素来找到出现次数超过数组长度一半的元素,时间复杂度为O(n),空间复杂度为O(1)。文章详细解释了算法的核心思想、正确性证明,并提供了Java代码实现。算法首先初始化候选元素和计数器,遍历数组时通过比较和抵消操作更新候选元素,最终剩余的候选即为多数元素。该方法适用于大规模数据,满足进阶要求。
2025-07-28 07:00:00
337
原创 【简单】力扣算法解析171:Excel表列序号
这篇文章讲解了如何将Excel列名称转换为对应的列序号。核心思路是将列名称视为26进制数(A=1到Z=26),通过逐位计算实现进制转换。代码实现采用遍历字符串,每次将当前结果乘以26并加上字符对应的数值。文章包含解题思路、Java代码实现及示例解析,时间复杂度为O(n),空间复杂度为O(1)。适合需要解决类似进制转换问题的读者参考。
2025-07-28 07:00:00
223
原创 【中等】力扣算法解析172:阶乘后的零
这道题要求计算n!末尾有多少个零。解题关键在于统计阶乘结果中因子5的个数,因为每个5和2相乘会产生一个10,而2的数量总是多于5。通过不断除以5并累加商,可高效统计5的因子总数。算法时间复杂度为O(log₅n),空间复杂度O(1)。Java实现通过循环累加n除以5的结果,直到n为0。示例显示n=100时有24个尾随零。该方法满足题目要求,且高效准确。
2025-07-28 07:00:00
226
原创 【中等】力扣算法解析173:二叉搜索树迭代器
本文介绍了如何实现一个二叉搜索树(BST)的中序遍历迭代器 BSTIterator,支持按序访问节点值。通过使用栈模拟递归过程,将空间复杂度优化至 O(h)(h 为树高),并保证 next() 和 hasNext() 的均摊时间复杂度为 O(1)。初始化时将所有左子节点入栈,每次调用 next() 弹出栈顶节点后,再处理其右子树的左链。hasNext() 只需检查栈是否为空。该方法高效且节省内存,适用于大规模数据。
2025-07-28 07:00:00
1242
原创 【困难】力扣算法解析174:地下城游戏
本文探讨了如何计算骑士从地下城左上角移动到右下角救公主所需的最低初始健康点数。采用逆向动态规划方法,从终点向起点递推,定义 dp[i][j] 为从位置 (i, j) 到终点的最小初始血量。通过处理边界条件和状态转移(选择向右或向下移动的较小血量需求),最终得到起点的 dp[0][0] 即为答案。该方法优化了空间复杂度,适用于二维网格场景。
2025-07-28 07:00:00
365
原创 【简单】力扣算法解析175:组合两个表
这篇SQL题解要求查询人员信息及其地址,若地址不存在则显示NULL。 该题目需要从Person表和Address表中联合查询每个人的姓名和地址信息。解题使用LEFT JOIN操作,确保保留Person表中的所有记录,当Address表中无匹配时自动填充NULL值。SQL语句简洁高效,通过主键关联实现最优索引利用,仅需一次表扫描即可完成数据匹配。最终输出包含firstName、lastName、city和state字段,其中缺失的地址信息显示为NULL。这种方法既保证了数据完整性又具有良好性能。
2025-07-28 07:00:00
966
原创 【简单】力扣算法解析170:两数之和 III - 数据结构设计
题目要求设计一个支持动态添加数字和快速查询两数之和的数据结构。使用哈希表存储数字及其出现次数,add操作的时间复杂度为O(1),find操作遍历哈希表,时间复杂度为O(n)。关键点在于处理重复元素(如3+3=6)和避免无效配对(如不能使用同一个数字两次)。示例代码展示了如何用Java实现该结构,通过哈希表高效处理添加和查询操作。
2025-07-28 07:00:00
457
原创 【简单】力扣算法解析163.:缺失的区间
给定一个有序整数数组nums和范围[lower, upper],返回数组中缺失的数字区间。缺失区间表示为字符串列表,单个数字直接输出,连续区间用"a->b"表示。解题思路:遍历数组,检查相邻元素的差值,差值≥2时生成缺失区间。处理数组开头和结尾的边界情况。使用long类型防止整数溢出。
2025-07-28 07:00:00
316
原创 【中等】力扣算法解析161:相隔为1的编辑距离
题目要求判断两个字符串的编辑距离是否为1。通过分析插入、删除、替换三种操作,得出以下结论:若长度差超过1则直接返回false;长度相等时需有且仅有一个不同字符;长度差为1时需较长的字符串多一个字符且剩余部分完全相同。采用双指针逐位比较优化子串匹配,确保时间复杂度为O(n),空间复杂度为O(1)。代码通过统一处理方向(确保s较短)和辅助函数高效比较剩余字符,最终给出结果。示例与提示进一步明确了边界条件与输入范围。 关键词: 编辑距离、双指针、字符串比较、Java实现、算法优化
2025-07-28 07:00:00
204
原创 【简单】力扣算法解析160:相交链表
本文介绍了一种高效寻找两个无环单链表相交节点的方法,采用双指针遍历算法。核心思想是通过让两个指针分别遍历两个链表并在到达末尾时切换到对方链表头部,最终在相交节点相遇或同时到达链表末尾(表示不相交)。该方法时间复杂度为O(m+n),空间复杂度为O(1)。文章提供了Java实现代码,并通过示例图解说明了算法的正确性和边界条件处理。
2025-07-27 12:19:42
748
原创 【中等】题解力扣159:至多包含两个不同字符的最长子串
题目: 找出字符串中至多包含两个不同字符的最长子串长度。 方法:滑动窗口 + 哈希表优化 思路: 使用双指针维护窗口,哈希表记录字符的最后出现位置。当窗口内字符种类超过2时,删除最左字符的位置,直接跳跃移动左指针。 复杂度: 时间O(n),空间O(1)。 代码: Java实现通过哈希表快速定位需删除的字符,确保高效性。
2025-07-27 11:57:10
315
原创 【困难】题解力扣158:用Read4读取N个字符Ⅱ-多次调用
题目要求利用 read4 API 实现 read 方法,支持多次调用并从上一次结束位置继续读取。核心挑战在于处理跨调用缓存,需用固定数组存储多余字符。算法通过优先读取缓存、调用 read4 补充数据、按需复制字符并更新指针实现高效读取。Java 代码使用环形缓冲区(offset 和 bufsize 指针)管理缓存,确保空间复杂度为 O(1)。关键操作包括 System.arraycopy 和环形索引更新,最终返回实际读取的字符数。
2025-07-27 11:49:49
301
原创 【简单】题解力扣157:用 Read4 读取 N 个字符
题目要求实现一个 read 方法,通过 read4 API 读取文件中的 n 个字符到目标缓冲区 buf。核心思路是循环调用 read4,每次最多读取4个字符,并复制到 buf 中,同时确保不超过 n 的限制。关键点包括:动态计算每次需复制的字符数(取 read4 返回值与剩余需读字符数的最小值),并在文件结束或读满 n 字符时终止循环。代码通过临时缓冲区存储 read4 的结果,时间复杂度为 O(n),空间复杂度为 O(1)。示例与边界情况(如文件不足 n 字符)均被覆盖。
2025-07-27 11:33:01
285
原创 【中等】题解力扣156:上下翻转二叉树
文章介绍了如何翻转满足特定条件的二叉树,并提供了迭代法和Java代码实现。 二叉树上下翻转问题:给定一个右节点均为叶节点或空的二叉树,要求通过翻转规则将树重构。翻转后,原左子节点变为根节点,原根节点变为右子节点,原右子节点变为左子节点。 解题核心:使用迭代法,通过三个指针(当前节点、父节点、右兄弟节点)在遍历左子树时完成指针翻转。时间复杂度O(n),空间复杂度O(1)。 代码实现:通过循环逐步调整指针关系,最终返回最左叶子节点作为新根。边界情况(空树或单节点)直接返回原树。 关键词:二叉树翻转
2025-07-27 10:51:53
710
原创 【中等】题解力扣146:LRU缓存
本文介绍了一种基于哈希表和双向链表实现的LRU(最近最少使用)缓存机制,能够在O(1)时间复杂度内完成get和put操作。该设计通过维护访问顺序(最近访问节点靠近头部)和哈希快速查找,实现了高效缓存管理。具体实现中,双向链表用于记录访问顺序,哈希表用于快速定位节点。当缓存满时,会自动淘汰链表尾部的节点。文章提供了Java代码实现和详细注释,并解释了核心操作逻辑和辅助方法的功能。
2025-07-27 07:00:00
532
原创 【中等】题解力扣147:对链表进行插入排序
本文介绍了链表的插入排序算法实现。通过创建虚拟头节点简化操作,维护已排序区间指针lastSorted和待处理节点指针curr。算法核心是将当前节点与已排序部分比较:若大于等于则直接追加,否则从头遍历找到插入位置。实现中使用了三个指针(dummy、lastSorted、curr)完成节点的移动和插入,时间复杂度O(n²),空间复杂度O(1)。代码包含边界条件处理和指针更新逻辑,适用于链表长度在1-5000范围内的排序需求。
2025-07-27 07:00:00
306
原创 【中等】题解力扣148:排序链表
本文介绍了一种高效排序链表的算法,采用自底向上的归并排序实现O(n log n)时间复杂度和O(1)空间复杂度。关键步骤包括:计算链表长度、逐步倍增子链表长度、精确截取子链表进行归并,并使用迭代法合并有序链表。算法通过哑结点和指针操作优化空间,避免了递归带来的额外消耗。文章提供了完整的Java实现代码,并分析了时间复杂度为O(n log n)和空间复杂度O(1)的性能特点,适合处理大规模链表排序问题。
2025-07-27 07:00:00
336
LeetCode算法题第1-50题可运行调试的完整源码(Java版的)
2025-07-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人