algo复习随记
文章平均质量分 85
note
lvy-
专栏更新已迁至github:lvy010,文章.md可直接clone repo获取,欢迎email交流(`・ω・´)(该账号现主用于随手复习记录,随缘同步)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hadoop|贪心
lc2064。原创 2026-01-06 16:36:25 · 53 阅读 · 0 评论 -
sl|deque实现|缓存命中率
deque底层实现与二分查找接口分块+中控数组在C++容器中, deque (双端队列)的底层设计和二分查找接口的支持性,结合分块思想与二分逻辑,可清晰梳理其设计原理与应用合理性。一、deque的底层实现核心1. 分块存储机制deque 并非连续线性存储,而是采用分块+中控数组的设计:数据被拆分到多个固定大小的内存块中,2. O(1)插入特性在 deque 首尾插入元素时,若对应块未存满,可直接放入实现O(1)时间复杂度;原创 2026-01-06 10:32:33 · 221 阅读 · 0 评论 -
分类贪心
按负数个数 分类贪心。原创 2026-01-05 13:34:13 · 106 阅读 · 0 评论 -
二分+bfs
lc1970public:i < v;i++) {j < col;j++) {while (!q.pop();原创 2025-12-31 21:56:29 · 350 阅读 · 1 评论 -
右端点对齐|镜像复用
lc3413镜像翻转 复用代码。原创 2025-12-31 16:42:38 · 156 阅读 · 0 评论 -
子序列贪心|回文
/ 主要是处理"00009"这种情况的。只有左边添加了大于'0'的数字才能在中间添加偶数个'0'// 先将大数字添加到最左边,只用考虑添加偶数个一半的数字"i"// 将数量为奇数的最大一个数字,添加在最中间。// 记录前面对称部分的最后一个下标。// 特判全 0 的情况。// 将右半部分补齐。原创 2025-12-30 19:58:35 · 176 阅读 · 0 评论 -
string|幻方
/ 比较剩余子串的字典序,选择更大的首字符。灵活调用substr api😋。原创 2025-12-29 23:24:19 · 129 阅读 · 0 评论 -
vector<int> dfs
j++) { //修改2~7号牢房的状态(牢房号1 ~ 8,对应下标0 ~ 7)//不能整除时返回第 n % (i - 1) 的状态。j++) { //看是否与第一天的状态相同,相同则说明出现了循环。if (i > 1 && flag) { //出现循环,周期为i - 1,直接返回map中对应的值。if (i == 1) { //第一天时,首尾牢房没有两个相邻牢房,状态设为0。//存储第i天牢房的的状态。原创 2025-12-29 18:27:05 · 154 阅读 · 0 评论 -
回溯+位运算|前缀和优化背包
/ 等价于 pyramid[n-1][i] = bottom[i]&31。// 清除之前填的字母,等价于 pyramid[i][j] = 0。// 等价于 pyramid[i][j] = top。// 注意这里把 k 减小了。// 计算 f[i] 的前缀和数组 s。原创 2025-12-26 22:16:49 · 700 阅读 · 0 评论 -
离散化+线段树|树状数组
/ 存储所有待离散化的值。// 找到第一个大于等于x的位置。// 二分求出x对应离散化的值。原创 2025-12-26 21:59:00 · 182 阅读 · 0 评论 -
压缩trick
再逐一校验障碍物坐标,若障碍物坐标在机器人到达目标点前的路径中则返回false,否则返回true。将路径坐标编码存入集合,计算目标点在指令循环后的剩余坐标,验证其是否在单次路径中;//圈数位置 无法抵达。模拟机器人执行一次指令的路径。原创 2025-12-26 15:30:27 · 226 阅读 · 0 评论 -
贪心|最小生成树|分段
/ 存储切割成本和类型,pair第一个值为成本,第二个值0代表水平(H)、1代表垂直(V)不是真的要写最小生成树,是为了证明采用这种贪心策略是“正确的”,写出来的代码是等价的....如果切晚了会有增加segment的风险,而cost最大线段增加的总cost也最多。if (type == 0) { // 水平切割。} else { // 垂直切割。把这个题目转成最小生成树模型,那么正确性就证明完毕了。// 按成本从大到小排序。“高费用的线段越早切越好”原创 2025-12-26 12:01:23 · 145 阅读 · 0 评论 -
逆序贪心
sort后贪心check单向压制。原创 2025-12-25 11:25:53 · 182 阅读 · 0 评论 -
前缀和+贪心|状压优化hash
/ 取三个值的最大值:当前机器需移出的衣物数、前缀和绝对值、当前结果。取“单台机器超量数”和“累积流量绝对值”的最大值,得到最少操作步数。为什么 machines[i] - avg 不用取绝对值呢。通过前缀和计算衣物转移的累积流量。先判断衣物总数能否均分。原创 2025-12-24 19:38:30 · 166 阅读 · 0 评论 -
pq|dfs|快排
先建树,DFS回溯维护每个字符的最近祖先,把同字符子节点移到最近祖先下重构树,最后DFS统计每个节点的子树大小。// 注意这里已经把 1 算进去了。= -1) { // y 没被删除。原创 2025-12-24 17:51:10 · 793 阅读 · 0 评论 -
hash+滑窗|逆序
if(mins[i] - mins[i-2] <= 60) { // 第i个和前2个的时间差<=60分钟。// 2. 检查每个姓名的时间是否有1小时内>=3次。//1. hash分组。原创 2025-12-24 13:22:12 · 283 阅读 · 0 评论 -
排序|倒序遍历|set
lclcp52public:set<int> s;if (!dfs(root);i >= 0;--i) {return ret;原创 2025-12-24 10:17:52 · 253 阅读 · 0 评论 -
rotate模拟|pq贪心
重量: 空气<石头<障碍物,然后给三种符号赋大小不同的int型,然后以每排障碍物之间的小数组为单位对每排数组进行排序(障碍物不参与排序)先把每行石头按重力堆到右侧(遇障碍停),再把处理后的矩阵顺时针转90度得到结果。//落到障碍物前一个。还有一种也挺好的思路。原创 2025-12-23 17:12:30 · 395 阅读 · 0 评论 -
排序+等差求和
/ coins 已排序,后面没有比 c 更小的数了。int m = 0;// 一开始只能构造出 0。// 无法构造出 m+1,继续循环没有意义。// [0,m] 中一共有 m+1 个整数。对有序硬币数组,从0开始累加能连续构造的数值上限。,最终返回可构造的连续整数个数。原创 2025-12-23 13:14:12 · 125 阅读 · 0 评论 -
dp+二分
/最多只能参加两个。// 结束时间 < t[0] 的位置。dp+二分查找,找出两个不重叠事件的最大价值和。// 按结束时间排序。原创 2025-12-23 10:13:12 · 386 阅读 · 0 评论 -
相邻不同_贪心
统计 nums 与 forbidden 对应位置相同元素,结合元素出现次数限制 (鸽巢 贪心_最多相同元素。计算使两数组对应位置元素匹配的最小交换次数。原创 2025-12-22 16:58:42 · 146 阅读 · 0 评论 -
贪心拆分
/ 奇数直接返回空。// 取下一个不同的偶数。先从2开始挨个加不同偶数,最后把剩下的数补到最后一个数上。// 从最小的偶数2开始取。// 补上剩余的差值。原创 2025-12-22 10:53:33 · 163 阅读 · 0 评论 -
差分+扫描线|子序列dp|区间覆盖查询
超过 sum 或 hi 后,修正失效,对应 d[sum+1]++ 和 d[hi+1]++ 把次数加回去。- 落在 [lo, sum) 区间的目标和,数对只需 1 次移动 → 总次数减 1,对应 d[lo]--。- 目标和等于 sum 时,数对无需移动 → 总次数再减 1,对应 d[sum]--。sum:差分在“全需 2 次移动”的基准上,按区间调整真实移动次数。差分统计数组两两配对和的不同区间所需移动次数,遍历求最小移动次数。//对可抵达的结果 差分。原创 2025-12-21 19:09:37 · 254 阅读 · 0 评论 -
pq贪心|差分+前缀和
pq最小堆 维护动态前k大。原创 2025-12-21 14:53:34 · 222 阅读 · 0 评论 -
贡献法+dfs|虚树
lc849public:total[x]++;continue;i <= mx;i++) {dfs(0, -1);return ans;原创 2025-12-21 14:48:58 · 298 阅读 · 0 评论 -
string|log
/ 删掉当前的前后缀(各走一步)// 移动前缀到第一个不同的位置。// 移动后缀到第一个不同的位置。原创 2025-12-21 09:45:29 · 411 阅读 · 0 评论 -
状压dp|dfs|dijk
每个工人分配部分任务,取“当前工人任务耗时”和“之前工人最大耗时”的较大值。预处理 抽象出jobs子集枚举 状态 +状压dp。最终找k个工人干完所有任务的最小最大耗时。原创 2025-12-20 15:29:15 · 232 阅读 · 0 评论 -
位运算
1 << (k - 1) 是 k 位二进制数的最高位掩码(比如 k=3 时就是 100 ), ~ 取反后和 cur 按位与,就能精准去掉超出 k 位的部分,保证 cur 始终是 k 位二进制对应的十进制数。- 第二步: 1 << (2-1) = 2 (二进制 10 ), ~2 对应二进制 ...1101 , 3 & ~2 = 1 (二进制 01 ),为下一次窗口右移做好准备。这等价于把旧数值的二进制整体左移 1 位,再补上右侧新字符的位。左移后数值的二进制位数会超过 k,用。原创 2025-12-20 08:56:32 · 245 阅读 · 0 评论 -
二维前缀+memo枚举
lc2958public:while(r<n)l++;r++;return ret;原创 2025-12-19 21:31:28 · 188 阅读 · 0 评论 -
二分|dfs|dp
二分 ,在“每个小孩分到的糖果数”的可能范围内(1到最大堆糖果数)check 判断该数量能否分给至少k个小孩。最终找到最大的可行数量。原创 2025-12-19 14:45:40 · 146 阅读 · 0 评论 -
lis|回文dp
/得到dp[i],并维护ans。if(scores[index[i]]>=scores[index[j]])//满足约束,进行保留。原创 2025-12-19 10:59:03 · 194 阅读 · 0 评论 -
dp|istringstream|memset
/高度,只能是最高高度。//用虚指,好初始化。j --) //往前探。{ //题目要求比较友好:书是“按顺序”摆放!每加进来一本书对答案产生怎样的影响。原创 2025-12-18 22:09:00 · 187 阅读 · 0 评论 -
simu|区间dp|前后缀_预处理
if (nums[l] % 2 == 0 && nums[l] <= threshold) { // 起始位需满足偶且≤阈值。l = r + 1;// 跳过当前子数组。// 不满足起始条件,移动左指针。原创 2025-12-18 16:53:49 · 186 阅读 · 0 评论 -
滑窗+hash|pii dfs
滑窗和hash天生一对。原创 2025-12-18 14:47:51 · 144 阅读 · 0 评论 -
presum|二分try+滑窗cnt
class Solution {public: long long maxProfit(vector<int>& prices, vector<int>& strategy, int k){ int n = prices.size(); vector<long long> sum(n + 1), sum_sell(n + 1); for (int i = 0; i < n; i++) { sum[i + 1] = sum[i]原创 2025-12-18 08:35:57 · 528 阅读 · 0 评论 -
pq优先处理最优候选|桶排序
lc1430bfspublic:if (!int i = 0;q.pop();i++;原创 2025-12-17 21:55:58 · 379 阅读 · 0 评论 -
pq|消消乐|定长滑窗
大于小根堆顶 可继承其会议室。原创 2025-12-17 13:29:14 · 199 阅读 · 0 评论 -
状态机dp
/处理一下,优化空间。//题目 给的 k 可能过大。原创 2025-12-17 10:09:26 · 362 阅读 · 0 评论 -
树|regex正则
lc563int dfspublic:int ret=0;if(!dfs(root);return ret;原创 2025-12-16 21:52:35 · 154 阅读 · 0 评论 -
☆ 异或和|倒数第二步
/ 翻转第一个数为 1 的行。vector<bool> 替代字符串存模式(更省内存,因为 vector<bool> 是比特级存储)加 move(t) 避免vector拷贝(直接转移内存所有权)统计出现次数最多的模式,其次数就是可得到的最多相等行数。把每行转化为“与首元素(基准)的异或模式串”统一模式,统计重复最多的模式数——本质是。次数最多的类就是答案。原创 2025-12-16 15:30:45 · 294 阅读 · 0 评论
分享