分享|解题方法记录(自用)
868
2024.09.25
2025.02.06
发布于 美国

左维护,右枚举:适用于前后双变量问题。

1014. 最佳观光组合
2207. 字符串中最多数目的子序列

滑动窗口:要求窗口内满足一定要求。

2516. 每种字符至少取 K 个
反向滑动窗口:移动窗口满足外部需求。

3171. 找到按位或最接近 K 的子数组
滑动窗口使得窗口内的值与K最近:移动右窗口直至大于k之后移动左窗口小于k。

3258. 统计满足 K 约束的子字符串数量 I
题目要求小于,滑动窗口条件设为等于,然后计算right-left+1。(每扩张一个r相当于增加了r - l + 1个以r为终点符合条件的子区间,ans累加数量即可。)

矩阵遍历改变方向:

2326. 螺旋矩阵 IV

单调遍历:使用二次查找

2187. 完成旅途的最少时间

并查集:一维数组+查找祖宗函数+合并族函数

684. 冗余连接

记忆化搜索:哈希表记录数组。

638. 大礼包
1547. 切棍子的最小成本
526. 优美的排列
即使之前被选择的数是有序的,在记忆化搜索时可以将他们考虑成无序的。

前缀和:记录每个从头开始的和为前缀和,中间连续子数组的元素和可以转换成两个前缀和的差

tips:一般看见题目说求[l,r]中的xxx数量可以转换为[0,r]-[0,l]中的数量时考虑。
303. 区域和检索 - 数组不可变
1871. 跳跃游戏 VII
前缀和不一定针对数字,也可以应用在是否可达。
设reachable[i] = 1为可达, prefixSum[i]为可达前缀和。
则reachable[i+1]是否为1由prefixSum[i]定。
最后prefixSum[i+1] = prefixSum[i] + 则reachable[i]。

环状问题可解决思路:数组×2

3208. 交替组 II

大小顶堆:本质上为优先级队列

使用c++ stl中的std::priority_queue
3264. K 次乘运算后的最终数组 I

线段树:

307. 区域和检索 - 数组可修改
732. 我的日程安排表 III

回溯:

78. 子集
90. 子集 II
47. 全排列 II

子集相关:无重复就是选与不选 dfs(i)->dfs(i+1),重复就是不选时相同的元素都不选。

评论 (14)