大三备战考研,如何高效找实习并掌握20道必会的时间复杂度题?

摘要:最近在准备 考研 + 找实习,复习数据结构的时候发现一件事: 很多同学会写代码,但一问 时间复杂度 就开始沉默。 比如: for(i=0;i<n;i++) for(
最近在准备 考研 + 找实习,复习数据结构的时候发现一件事: 很多同学会写代码,但一问 时间复杂度 就开始沉默。 比如: 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 道经典链表题二叉树面试必刷题考研数据结构高频考点 一起加油。 大三这一年,真的很关键。