前言
为什么你代码能跑,但面试总被挂?
为什么LeetCode能AC,一到大厂笔试就超时?
为什么两个人写出同样功能的代码,一个满分、一个直接淘汰?
答案只有一个:你不懂时间复杂度。
绝大多数编程新手、大二大三同学,都卡在同一个瓶颈:
只会写「能跑的代码」,不会写「高效的代码」。
时间复杂度是所有算法的地基,也是面试必考第一问。
今天用最通俗、零晦涩、全实战的方式,带你彻底吃透时间复杂度,看完直接吊打80%新手!
一、到底什么是时间复杂度?(人话版)
不谈教科书废话。
时间复杂度:用来预判你的代码运行速度的数学标准。
它不看代码行数、不看电脑配置,只看:
数据变多的时候,你的代码会不会越来越慢?慢得有多快?
算法等级从优到劣:
$$O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!)$$
只要你能分清这7个等级,你的算法水平直接进阶一档。
二、七种复杂度逐句拆解(带真实代码场景)
1. O(1) 常数级 —— 最优解
无论数据多少,执行时间不变
常见场景:
– 变量赋值
– 数组随机取值
– 简单四则运算
示例:
int a = arr[10];
特点:永远不超时,算法天花板。
—
2. O(log n) 对数级 —— 面试最爱
数据翻倍,执行次数只+1
典型算法:二分查找
100万的数据,循环只跑20次,这就是为什么二分无敌快。
所有能不断「砍掉一半数据」的算法,都是 logn
—
3. O(n) 线性级 —— 正常遍历
数据多大,循环多少次
场景:单for循环、遍历数组、遍历链表
能过绝大多数常规题目,但是数据量10万+会吃力
—
4. O(n log n) 线性对数 —— 工业级最优排序
最常见:快速排序、归并排序、Arrays.sort()
大厂项目、底层源码全部是这个复杂度。
可以处理百万级、千万级数据
这是工程里最实用、最平衡的复杂度
—
5. O(n²) 平方级 —— 新手重灾区
双重for循环
暴力枚举、两数求和暴力写法、冒泡排序
数据量 1000 没问题
数据量 10000 直接超时卡死
笔试翻车第一名:O(n²)暴力写法
—
6. O(2ⁿ) 指数级
递归暴力枚举、子集枚举
数据n=30 直接爆炸,完全无法商用
—
7. O(n!) 阶乘级
全排列、暴力穷举所有可能性
基本属于只能跑n<12的玩具代码
三、面试官最爱问:为什么 O(n²) 一定会超时?
给你一组真实数据对比(秒懂)
– n = 100:O(n²)=1万次(随便跑)
– n = 1000:O(n²)=100万次(勉强跑)
– n = 10000:O(n²)=1亿次 (超时)
– n = 100000:O(n²)=100亿次 (直接卡死)
大厂笔试数据量最低都是 1e4、1e5
所以:双重循环暴力写法,从一开始就是错的
新手最大误区:
只要样例能过 = 代码正确
真实评判标准:大数据下不超时,才是正确代码
四、手把手教你:如何一眼看出复杂度
给大家一个万能口诀
1. 无循环 → O(1)
2. 单层循环 → O(n)
3. 双层循环 → O(n²)
4. 每次折半(二分)→ O(logn)
5. 排序+遍历 → O(nlogn)
6. 递归不剪枝 → O(2ⁿ)
不用计算、不用推导,一眼判定
五、真实面试优化案例(从超时到满分)
题目:查找数组两数之和
新手超时写法 O(n²)
双重循环枚举所有组合,数据量大直接超时
优化满分写法 O(n)
哈希表一次遍历,空间换时间
这就是面试最核心的算法优化思维
不是实现功能,是降复杂度
六、新手必背:笔试复杂度通关标准
记住这套标准,刷题永远不超时:
1. n ≤ 1e5 必须 O(n) 或 O(n logn)
2. n ≤ 1e6 只能 O(n)
3. n ≤ 1e3 可以勉强 O(n²)
4. 只要看到大数据,立刻放弃暴力
所有算法题的解题思路,都是根据复杂度反向推导的!
七、写在最后(提升认知)
很多人以为算法是刷题、是套路、是模板。
真正的算法核心,是复杂度思维。
看懂复杂度,你才能:
– 做题不超时
– 面试答得出原理
– 写得出工程级高效代码
– 真正从“会敲代码”进阶为“懂算法的开发者”
后续我会持续更新算法底层思维系列、面试必考手撕算法,想学真正能涨薪、能拿offer的算法,欢迎关注!
新手收藏口诀
**常数最快对数稳,线性正常排序准;
双重循环必超时,指数阶乘不要忍。**
—
标签:算法、时间复杂度、数据结构、Java算法、编程面试、算法优化、大学生编程、LeetCode
原创干货,点赞收藏,助你彻底摆脱代码超时问题!
网硕互联帮助中心



评论前必须登录!
注册