
数据结构与算法
27xixi
这个作者很懒,什么都没留下…
展开
-
力扣135.分发糖果
用两次遍历解力扣135.分发糖果。原创 2025-03-14 04:32:25 · 191 阅读 · 0 评论 -
回溯法--力扣第17题“电话号码的字母组合”(java)
回溯法通过递归遍历每个数字对应的字母,生成所有可能的组合。核心思想是构建搜索树,每次选择一个字母后进入下一层递归,回溯时撤销选择以尝试其他分支。构建数字到字母的映射表:使用数组或哈希表存储每个数字对应的字母。终止条件:当前路径长度等于输入数字字符串长度时,将结果加入列表。遍历当前数字对应的所有字母,依次选择、递归、撤销选择。力扣第17题“电话号码的字母组合”原创 2025-03-14 04:26:00 · 397 阅读 · 0 评论 -
双路快排--力扣215.数组中的第K个最大元素(java)
快速选择算法:基于快速排序的分区思想,每次选择一个基准元素将数组分为两部分,左边的元素小于等于基准,右边的元素大于基准。//缩小搜索范围:根据基准元素的位置与目标位置(n - k)的比较,决定继续处理左半部分还是右半部分。随机化基准:通过随机选择基准元素,避免最坏时间复杂度,提高算法效率。原创 2025-03-13 23:44:24 · 238 阅读 · 0 评论 -
力扣215.数组中的第K个最大元素--堆排序法(java)
为了找到数组中第K个最大的元素,我们可以使用堆排序的方法。堆排序的核心是构建一个最大堆,并通过多次交换堆顶元素来找到前K个最大的元素。交换并调整堆:执行K次交换操作,每次将堆顶元素(当前最大值)与当前堆的末尾元素交换,然后调整剩下的元素以维持最大堆的性质。构建最大堆:将输入数组转换为最大堆,使得每个父节点的值大于其子节点的值。获取结果:经过K次交换后,第K个最大的元素会位于数组的倒数第K个位置。原创 2025-03-13 19:10:05 · 183 阅读 · 0 评论 -
回溯算法--数组/和/差值最小
10个数字分成两组,每组5个,让第一个数组的和与第二个数组的和的差最小值。时间复杂度:O(C(10,5)) = 252次组合计算,属于可行范围。当选中5个元素时,计算当前组合和与总和的差值。空间复杂度:O(n) 递归深度最大为10层。双分支分别处理选择/不选择当前元素的情况。读取一行输入并分割为字符串数组。计算数组总和用于后续差值计算。递归遍历所有可能的5元素组合。验证输入必须包含10个整数。通过索引递增避免重复计算。将字符串转换为整型数组。初始化最小差值为极大值。原创 2025-02-25 02:33:29 · 339 阅读 · 0 评论 -
单调栈--分奖金
第一个员工(2)向后找到第一个比自己大的数字是 10,距离为 1,差值为 8,奖金为 1 × 8 = 8。单调栈适用于类似的查找右边第一个比自己大(小)的数字的问题。从左到右遍历数组,利用单调栈找到每个员工右边第一个比自己大的数字。第二个员工(10)找不到比自己大的数字,奖金为 10。如果找不到比自己大的数字,则奖金为自己随机数字的数量。如果找不到比自己大的数字,则奖金为自己随机数字的数量。第三个员工(3)找不到比自己大的数字,奖金为 3。栈中存储员工的索引,确保栈中的数字是递减的。原创 2025-02-22 15:37:40 · 267 阅读 · 0 评论 -
算法题--运维日志排序
正则表达式 “(\d+)😦\d+)😦\d+)(?:\.(\d+))?使用 Integer.parseInt 提取时间部分,并计算总毫秒数。添加异常处理,确保输入格式错误时程序不会崩溃。:\.(\d+))?:可选匹配毫秒部分。(\d+):匹配小时、分钟、秒。改进1:增强正则表达式的健壮性。改进2:优化时间转换逻辑。改进3:增强代码可读性。原创 2025-02-20 23:13:36 · 501 阅读 · 0 评论 -
动态规划-力扣第300题“最长递增子序列”
*而不是dp[i] = dp[j] + 1;举个例子:27869,i=4,j=2时dp[j] = 3,j=3时dp[j] = 2。dp[j]后面是可能比前面大的,这样遍历前面得到的dp[i]是可能更大的,但是我们只取最大的就好了。如果 nums[j] < nums[i],说明 nums[i] 可以接在 nums[j] 后面,更新 dp[i] = max(dp[i], dp[j] + 1)。对于每个 i,遍历 j 从 0 到 i-1,如果 nums[j] < nums[i],则更新 dp[i]。原创 2025-02-19 21:19:23 · 347 阅读 · 0 评论 -
01背包算法-代表团坐车详解
用自然语言表达:当考虑接待当前代表团时,所有能承载 j 人的方案,都可以通过增加当前代表团扩展为承载 (j+group) 人的新方案。如果是正序遍历,当处理到较大的 j 值时,可能已经使用了当前代表团的信息,导致重复计数。状态独立性:确保 dp[j] 是未考虑当前代表团时的状态值。动态规划转移还可以写成:(更符合模版写法)物品 → 代表团(每个代表团只能选一次)新增一个载客量为 group 的代表团。该状态的方案数需要累加原状态的方案数。新的载客量状态 j + group。目标 → 恰好装满背包的方案数。原创 2025-02-19 11:16:40 · 145 阅读 · 0 评论 -
力扣第416题“分割等和子集”
计算总和:首先计算数组的总和 sum,如果 sum 是奇数,那么肯定无法分割成两个和相等的子集,直接返回 false。给定一个只包含正整数的非空数组 nums,判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。dp[j - num] 表示是否可以从数组中选出一些数,使得它们的和等于 j - num。DP数组:dp[j] 表示是否可以从数组中选出一些数,使得它们的和等于 j。dp[j] 表示是否可以从数组中选出一些数,使得它们的和等于 j。空间复杂度:O(target),使用了一维数组 dp。原创 2025-02-17 18:24:12 · 177 阅读 · 0 评论