蓝桥杯算法模板与 LeetCode 题目推荐
🧩 蓝桥杯必学算法模板 & LeetCode 题目推荐
1️⃣ 枚举(暴力)
模板
// 枚举两个数对
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
// do something
// 全排列 next_permutation
sort(a.begin(), a.end());
do {
// 使用当前排列
} while (next_permutation(a.begin(), a.end()));
LeetCode 推荐
- 46.Permutations
- 47.Permutations II
- 728.自除数
- 996.正方形拼图
2️⃣ 排序 + 自定义排序
模板
struct Node {
int x, y;
bool operator<(const Node& other) const {
return x < other.x;
}
};
bool cmp(Node a, Node b) {
return a.y < b.y;
}
sort(a.begin(), a.end(), cmp);
LeetCode 推荐
- 56.Merge Intervals
- 452.用最少数量的箭引爆气球
- 135.分发糖果
3️⃣ 搜索(DFS / BFS)
DFS 模板
void dfs(int u) {
visited[u] = true;
for (auto v : graph[u])
if (!visited[v]) dfs(v);
}
BFS 模板
queue<int> q;
q.push(start);
while (!q.empty()) {
int cur = q.front(); q.pop();
for (auto next : graph[cur])
if (!visited[next]) {
visited[next] = true;
q.push(next);
}
}
LeetCode 推荐
- 200.岛屿数量
- 695.岛屿的最大面积
- 542.01矩阵
- 1091.二进制矩阵中的最短路径
4️⃣ 贪心
LeetCode 推荐
- 122.买卖股票的最佳时机 II
- 455.分发饼干
- 435.无重叠区间
- 134.加油站
5️⃣ 动态规划(DP)
0/1 背包模板
for (int i = 1; i <= n; ++i)
for (int j = V; j >= w[i]; --j)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
完全背包模板
for (int i = 1; i <= n; ++i)
for (int j = w[i]; j <= V; ++j)
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
LeetCode 推荐
- 70.爬楼梯
- 198.打家劫舍
- 322.零钱兑换
- 139.单词拆分
6️⃣ 前缀和 / 差分
一维前缀和
s[0] = 0;
for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
二维前缀和
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
差分数组
d[l] += x;
d[r+1] -= x;
LeetCode 推荐
- 303.区域和检索 - 数组不可变
- 370.区间加法
- 1094.拼车
7️⃣ 图论基础
建图模板
vector<vector<int>> graph(n);
graph[u].push_back(v);
拓扑排序模板
queue<int> q;
for (int i = 0; i < n; ++i)
if (indegree[i] == 0) q.push(i);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : graph[u])
if (--indegree[v] == 0)
q.push(v);
}
LeetCode 推荐
- 207.课程表
- 210.课程表 II
- 133.克隆图
8️⃣ 并查集(Union-Find)
模板
int find(int x) {
return x == parent[x] ? x : parent[x] = find(parent[x]);
}
void union_set(int a, int b) {
parent[find(a)] = find(b);
}
LeetCode 推荐
- 547.省份数量
- 684.冗余连接
- 1319.连通网络的操作次数
9️⃣ 数学 + 数论
快速幂模板
int qmi(int a, int b, int mod) {
int res = 1;
while (b) {
if (b & 1) res = (long long)res * a % mod;
a = (long long)a * a % mod;
b >>= 1;
}
return res;
}
LeetCode 推荐
- 50.Pow(x, n)
- 231.2的幂
- 202.快乐数
🔟 字符串处理
常用函数
s.substr(i, len);
stoi(s), stoll(s);
to_string(x);
reverse(s.begin(), s.end());
LeetCode 推荐
- 14.最长公共前缀
- 125.验证回文串
- 415.字符串相加
- 67.二进制求和
🔚 补充进阶建议
- LeetCode 307.可变区域和(线段树)
- LeetCode 241.区间DP
- LeetCode 698.状压DP
赛前经验分享
赛前经验:
[1. 蓝桥杯赛前突击]
[2. 关于蓝桥杯等算法竞赛的经验总结]
[3. 基础数论篇]
[4. 图论模版篇]
[5. 蓝桥杯赛前准备]