大三备战考研 + 找实习:我整理了 20 道必会的时间复杂度题(建议收藏)
最近在准备 考研 + 找实习,复习数据结构的时候发现一件事: 很多同学会写代码,但一问 时间复杂度 就开始沉默。 比如: 时间复杂度是多少? 有人说 O(n²),没问题。 但如果稍微变一下: 很多人就懵了。 而实际上,时间复杂度是考研和面试的高频考点。 所以我整理了 20 道经典时间复杂度题,难度不高,但非常有代表性。 如果你是: 建议认真看一遍。 简单来说: 时间复杂度就是:算法执行次数随着输入规模 n 增长的变化趋势。 我们一般用 大 O 表示法(Big-O) 表示。 常见复杂度排序: 效率从高到低依次下降。 执行次数: 时间复杂度: O(n) 执行次数: 时间复杂度: O(n²) 执行次数: 时间复杂度: O(nm) 执行次数: 时间复杂度: O(n³) 变化过程: 执行次数: 时间复杂度: O(log n) 变化过程: 执行次数: 时间复杂度: O(log n) 复杂度: 根据 大O法则取最大项 最终: O(n) 执行次数: 复杂度: O(n log n) 执行次数: 这是经典公式: 1 + 2 + 3 + ... + n = n(n+1)/2 时间复杂度: O(n²) 执行次数: 复杂度: O(n²) 执行次数: 复杂度: O(log n) 递归深度: 时间复杂度: O(log n) 每次缩小一半。 复杂度: O(log n) 这是 所有面试必问算法之一。 复杂度: O(n) 这是经典的 分治递归。 递归公式: 复杂度: O(n log n) 平均: O(n log n) 最坏: O(n²) 复杂度: O(n²) 最坏情况: O(n²) 最好情况: O(n) 遍历数组: 复杂度: O(n) 平均复杂度: O(1) 最坏情况: O(n) 如果时间不多,至少记住这 5 个: 给大家总结 4 个实用技巧: 常见三种: 例如: 最终: 数据结构其实没有想象中那么难。 真正难的是: 没有系统刷题。 如果你: 建议: 把时间复杂度题至少练 50 道。 很多算法题其实第一步就是: 先分析复杂度。 如果这一步不会,代码基本也写不出来。 如果这篇文章对你有帮助,可以: 后面我也会继续整理: 一起加油。 大三这一年,真的很关键。 本文由mdnice多平台发布for(i=0;i<n;i++)
for(j=0;j<n;j++)for(i=1;i<n;i*=2)一、什么是时间复杂度?
O(1) 常数级
O(log n) 对数级
O(n) 线性级
O(n log n)
O(n²)
O(n³)
O(2^n)
O(n!)
O(n^n)二、20 道经典时间复杂度题
1 基础循环
for(int i=0;i<n;i++){
printf("hello");
}n2 双重循环
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("hi");
}
}n × n3 不同变量循环
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("hi");
}
}n × m4 三重循环
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
printf("hi");
}
}
}n³5 循环减半
for(int i=n;i>0;i/=2){
printf("hi");
}n
n/2
n/4
n/8log₂ n6 倍增循环
for(int i=1;i<n;i*=2){
printf("hi");
}1
2
4
8
16log₂ n7 n + log n
for(int i=0;i<n;i++){
printf("a");
}
for(int j=1;j<n;j*=2){
printf("b");
}O(n + log n)8 嵌套对数循环
for(int i=0;i<n;i++){
for(int j=1;j<n;j*=2){
printf("hi");
}
}n × log n9 三角循环
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
printf("hi");
}
}1 + 2 + 3 + ... + n10 减少型嵌套循环
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
printf("hi");
}
}n + (n-1) + (n-2) + ... + 111 while + n 减半
while(n>1){
n = n/2;
}log₂ n12 递归减半
void f(int n){
if(n<=1) return;
f(n/2);
}log₂ n13 二分查找
while(l <= r){
mid = (l+r)/2
}14 递归二叉分裂
T(n) = 2T(n/2) + O(1)15 归并排序
T(n) = 2T(n/2) + O(n)16 快速排序平均复杂度
17 冒泡排序
for(i=0;i<n;i++)
for(j=0;j<n-i;j++)18 插入排序
19 顺序查找
0 → n20 哈希查找
三、面试和考研最爱考的 5 个复杂度
算法 复杂度 二分查找 O(log n) 快速排序 O(n log n) 归并排序 O(n log n) 冒泡排序 O(n²) 哈希查找 O(1) 四、如何快速判断时间复杂度?
1 看循环层数
1层 → O(n)
2层 → O(n²)
3层 → O(n³)2 看变量变化
i++
→ O(n)
i*=2
→ O(log n)3 递归看递归树
T(n)=T(n-1) → O(n)
T(n)=T(n/2) → O(log n)
T(n)=2T(n/2) → O(n)4 只保留最高阶
O(n² + n + 100)O(n²)五、写在最后