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