🧩 1. 反转链表
1 |
|
🌳 2. 二叉树中序遍历(递归)
1 |
|
🌐 3. 图的 BFS 遍历
1 |
|
🔠 4. 滑动窗口:最长无重复子串
1 |
|
📦 5. 动态规划:最长上升子序列 LIS
1 |
|
6. 并查集(Union-Find)
1 | class UnionFind { |
讲解:
数据结构:
parent
数组:parent[i]
存储节点i
的父节点,根节点的父节点是自己。
操作逻辑:
find(x)
递归寻找并返回根节点,同时做路径压缩(优化),将路径上所有节点直接挂到根节点上。unite(x, y)
合并两个集合,把一个根挂到另一个根下面。connected(x, y)
判断两个节点是否属于同一个集合。
应用场景:
- 判断连通性,解决无向图中连通块个数问题,处理动态合并集合问题。
一、图论类:BFS & DFS
BFS
1 |
|
DFS
1 | void dfs(int node, vector<vector<int>> &graph, vector<int> &visited){ |
✅ 常用排序算法总览
算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 是否原地排序 | 适用场景 |
---|---|---|---|---|---|
冒泡排序 | O(n²) | O(1) | ✅ 稳定 | ✅ 原地 | 教学用,基础 |
插入排序 | O(n²) | O(1) | ✅ 稳定 | ✅ 原地 | 几乎有序数组 |
选择排序 | O(n²) | O(1) | ❌ 不稳定 | ✅ 原地 | 数据量小 |
快速排序 | O(n log n) | O(log n) | ❌ 不稳定 | ✅ 原地 | 实战最常用 |
归并排序 | O(n log n) | O(n) | ✅ 稳定 | ❌ 非原地 | 数据量大,要求稳定性 |
堆排序 | O(n log n) | O(1) | ❌ 不稳定 | ✅ 原地 | Top-K问题 |
计数排序 | O(n + k) | O(k) | ✅ 稳定 | ❌ 非原地 | 整数值域小 |
桶排序 | O(n) ~ O(n²) | O(n + k) | ✅ 稳定 | ❌ 非原地 | 数据均匀分布 |
基数排序 | O(nk) | O(n + k) | ✅ 稳定 | ❌ 非原地 | 字符串、大整数排序 |
🔹 1. 冒泡排序 Bubble Sort
1 | void bubbleSort(vector<int>& arr) { |
每次把最大的数“冒泡”到最后。
简单易懂,但效率很差。
🔹 2. 插入排序 Insertion Sort
1 | void insertionSort(vector<int>& arr) { |
- 把当前元素插入到前面有序部分的正确位置。
🔹 3. 选择排序 Selection Sort
1 | void selectionSort(vector<int>& arr) { |
- 每次选择最小值放到前面。
🔹 4. 快速排序 Quick Sort(🔥重点)
1 | void quickSort(vector<int>& arr, int left, int right) { |
分治思想,效率高,实战常用。
平均 $O(n\log n)$,最坏 $O(n^2)$。
🔹 5. 归并排序 Merge Sort(稳定,适合大数据)
1 | void merge(vector<int>& arr, int left, int mid, int right) { |
使用辅助数组,时间复杂度始终是 $O(n\log n)$。
稳定排序,常用于面试题和外部排序。
🔹 6. 堆排序 Heap Sort(使用 priority_queue 实现)
1 | void heapSort(vector<int>& arr) { |
实现一个大顶堆,每次取最大值。
实际更适合处理 top-K 类问题。
✅ 总结:面试推荐重点掌握的排序算法
类型 | 是否必须掌握 | 说明 |
---|---|---|
快速排序 | ✅✅✅ | 面试最常见 + 手写能力考察 |
归并排序 | ✅✅ | 稳定排序,需掌握合并逻辑 |
插入排序 | ✅ | 适合 nearly sorted 情况 |
堆排序 | ✅ | 理解堆结构与 STL 用法 |
✅ STL 排序简写
1 | sort(arr.begin(), arr.end()); // 升序 |
Support me with a coffee?