蓝桥杯算法模板与题目推荐


蓝桥杯算法模板与 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. 蓝桥杯赛前准备]


文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录